欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
linux寶庫/python/最小的Zope編程 How-to
最小的Zope編程 How-to
作者:maxm 最后修改時(shí)間:2001/08/12 翻譯:limodou 翻譯時(shí)間:2001/10/25

>>原文鏈接:http://www.zope.org/Members/maxm/HowTo/minimal_01/

Zope產(chǎn)品的編程享有困難的名聲。這不是真的。我相信這只不過(guò)是因為所演示的例子造成的,就象令人討厭的類(lèi)一樣,展示了太多的特性的緣故。而且這些例子在解釋功能的時(shí)候還跳過(guò)了幾個(gè)步驟,使得“Zope”的道路看上去很長(cháng)并令人厭煩。所有不必要的額外的代碼“只是因為要加入”而被加進(jìn)去了。

我還記得第一次看到這些令人討厭的例子的時(shí)候,我想這些都是關(guān)于Zope的難懂的巫術(shù),不會(huì )有人真正的理解,除非在別的地方看到過(guò)。

因此我決定寫(xiě)一系列的How-to,用來(lái)解釋以最簡(jiǎn)單的方法來(lái)進(jìn)行Zope編程。這一過(guò)程將會(huì )非常非常緩慢,并且每一行代碼將被詳細地解釋。如果有任何東西你不太清楚,請把它告訴我。

這一系列的第二部分可以在這里找到。

一個(gè)非常簡(jiǎn)單的類(lèi)
作為開(kāi)始,我將創(chuàng )建一個(gè)可以想到的最簡(jiǎn)單的Python類(lèi),然后演示都需要向它加些什么東西,用來(lái)生成Zope的產(chǎn)品(product)。在那之后,我將演示另一個(gè)例子,它將這個(gè)簡(jiǎn)單產(chǎn)品進(jìn)行擴展用于其它方面。

我的最小的“Hello world”類(lèi)看上去象這樣:

class minimal:
def index_html(self):
return ‘<html><body>Hello World</body></html>‘
到了這里,它可以在Python中運行,但在Zope中不行。有幾個(gè)東西需要增加或進(jìn)行修改。第一件事情就是要知道Zope不會(huì )公開(kāi)(publish)不帶文檔字符串(doc string)的任何東西。所以需要把它加進(jìn)去:

class minimal:

"minimal object"

def index_html(self):
return ‘<html><body>Hello World</body></html>‘
Zope進(jìn)行對象公開(kāi)。意味著(zhù)一個(gè)在Python對象中的方法可以被看成web服務(wù)器上的一個(gè)頁(yè)面。這就是說(shuō)你最終可以將上面的類(lèi)的尋址寫(xiě)成象這樣:

http://localhost:8080/minimal_id/index_html

會(huì )得到“Hello World”的結果。但是你可以看到,這個(gè)對象有了一個(gè)叫做“minimal_id”的尋址。它是從哪來(lái)的?嗯沒(méi)什么地方。但是應該很明顯,任何一個(gè)對象需要一個(gè)id,以便Zope能夠對它尋址。所以我需要向對象增加一個(gè)id屬性。我將重復敘述“任何Zope產(chǎn)品必需擁有一個(gè)叫做id的屬性。否則Zope沒(méi)有辦法去調用它,你將沒(méi)有辦法給它一個(gè)URL”:

class minimal:

"minimal object"

def __init__(self, id):
"initialise a new instance of Minimal"
self.id = id # And this little fella is NOT optional

def index_html(self):
"used to view content of the object"
return ‘<html><body>Hello World</body></html>‘
編寫(xiě)和使用一個(gè)Zope產(chǎn)品有三個(gè)步驟:

1 所有的Zope產(chǎn)品需要被構造為Python的包。放在“lib/python/products/"中的一個(gè)文件夾中。Zope將這個(gè)目錄下的所有的包看成為產(chǎn)品,并且試著(zhù)在啟動(dòng)時(shí)安裝它們。這個(gè)包在某些階段必需使用Zope API以便可以通過(guò)Zope進(jìn)行發(fā)布。

2 如果包創(chuàng )建的正確,它將在Zope管理視圖中的產(chǎn)品列表中顯示出來(lái)。

3 它現在可以被安裝了。意味著(zhù)你可以將這個(gè)產(chǎn)品的一個(gè)拷貝放到任何你喜歡的文件夾中去。只要進(jìn)入一個(gè)文件夾,從選擇框中選擇這個(gè)產(chǎn)品就可以了 (譯注:這里已經(jīng)是在說(shuō)從Zope的內容管理界面中增加一個(gè)產(chǎn)品,而不是產(chǎn)品的安裝)。這就是Zope真正的力量。如果你生成了一個(gè)產(chǎn)品,它就能夠在你的或其它某個(gè)人的站點(diǎn)的任何地方被容易地重用。你可以把它放到Zope.org上,讓其它人在他們的站點(diǎn)上使用它。這個(gè)真是太-太-太-偉大了,恕我直言,這就是使用Zope的最真正的原因。

哦,另外還有一點(diǎn)東西需要加入,就是允許向一個(gè)文件夾添加產(chǎn)品。需要在選擇框中有一個(gè)名字才行。這就叫做"元類(lèi)型(meta_type)",它應該是給你的產(chǎn)品起的唯一識別的名字。所以不要把它叫成象“dtml-document”或“Folder”或類(lèi)似的東西。

我把這個(gè)產(chǎn)品的元類(lèi)型定為“minimal”:

class minimal:

"minimal object"

meta_type = ‘minimal‘ # this is the same for all
# instances of this class
# so it‘s declared here and
# not in "__init__()"

def __init__(self, id):
"initialise a new instance of Minimal"
self.id = id # And this little fella is NOT optional

def index_html(self):
"used to view content of the object"
return ‘<html><body>Hello World</body></html>‘
為了同Zope一起良好的運行,我的類(lèi)得需要一些基本的功能。通常通過(guò)對一個(gè)叫做“SimpleItem.Item”的類(lèi)進(jìn)行子類(lèi)化來(lái)實(shí)現。

從Zope書(shū)中引用的原話(huà)為“這個(gè)基類(lèi)向你提供能夠同Zope管理界面一同工作所需要的基礎。通過(guò)從Item進(jìn)行繼承,你的產(chǎn)品類(lèi)可以獲得一大堆的特性:剪切和粘貼的能力,具有管理視圖的能力,WebDAV支持,基本的FTP支持,撤消支持,所有權支持,和遍歷(traversal)控制。同時(shí)它也向你提供了一些標準的方法用于管理視圖和包括了manage_main()的錯誤顯示。你也可以得到getId(),title_or_id(), title_and_id()方法和this()的DTML應用方法。最后這個(gè)類(lèi)向你的產(chǎn)品提供基本的對dtml-tree標記的支持。Item真是一個(gè)提供了除廚房和水池外一切東西的基類(lèi)。”

但實(shí)際上我可以做的比它更出色。有另一個(gè)叫做“SimpleItem.SimpleItem”的類(lèi),它可以實(shí)現所以上面的功能,而且更多。“SimpleItem.SimpleItem”還提供了獲取(aquisition)和持續(persistence)的功能。

這個(gè)類(lèi)位于OFS的Zope包中,所以它必需被導入。然后我修改了類(lèi)的聲明以便“minimal”類(lèi)可以對其子類(lèi)化(譯注:用派生可能更清楚):

from OFS import SimpleItem

class minimal(SimpleItem.SimpleItem):

"minimal object"

meta_type = ‘minimal‘ # this is the same for all
# instances of this class
# so it‘s declared here and
# not in "__init__()"

def __init__(self, id):
"initialise a new instance of Minimal"
self.id = id # And this little fella is NOT optional

def index_html(self):
"used to view content of the object"
return ‘<html><body>Hello World</body></html>‘
技巧!這面是Zope在使用中的技巧之一。Python可以一次從幾個(gè)基類(lèi)進(jìn)行繼承。一些類(lèi)提供了某些種類(lèi)的功能,別一些則提供了另一些。這種混合類(lèi)的編碼風(fēng)格叫作“mixins”[1],它強大但理解困難。小心一點(diǎn)!

現在我有了一個(gè)完整的類(lèi)。我僅需要一個(gè)可以將對象放入一個(gè)文件夾的方法。這可以通過(guò)名為“_setObject()”的標準Zope方法來(lái)實(shí)現。

_setObject是一個(gè)在ObjectManager類(lèi)中的方法。這一部分要花一點(diǎn)心思去理解,因為_(kāi)setObject()不是做為minimal的方法,而是作為ObjectManager的方法(minimal類(lèi)將被加入其中)來(lái)調用的。

如果我試著(zhù)向一個(gè)叫做myFolder的文件夾添加一個(gè)minimal類(lèi),我象這樣調用:

myFolder._setObject(‘minimal‘, minimal(‘minimal_id‘))
僅有“_setObject”是不可能將一個(gè)你的對象實(shí)例插入到一個(gè)文件夾中去的。必需要調用它,并給出一些參數。所以我需要一個(gè)新的方法來(lái)做這件事。我叫它為“manage_addMinimal()”方法。

from OFS import SimpleItem

class minimal(SimpleItem.SimpleItem):

"minimal object"

meta_type = ‘minimal‘ # this is the same for all
# instances of this class
# so it‘s declared here and
# not in "__init__()"

def __init__(self, id):
"initialise a new instance of Minimal"
self.id = id # And this little fella is NOT optional

def index_html(self):
"used to view content of the object"
return ‘<html><body>Hello World</body></html>‘

    def manage_addMinimal(self):
"Add a Minimal to a folder."
self._setObject(‘minimal_id‘, minimal(‘minimal_id‘))
從函數的作用范圍可以清楚的看到,manage_addMinimal()函數是從試圖向自身添加minimal產(chǎn)品的文件夾中調用的。所以換句話(huà)說(shuō),manage_addMinimal()方法不是屬于“minimal”類(lèi)的方法,而是屬于“ObjectManager”類(lèi)的方法。

"self._setObject(‘minimal_id‘, minimal(‘minimal_id‘))"
傳入的第一個(gè)參數是id。這里我叫它為minimal_id。所以id是對這個(gè)對象的硬連接,應該總是minimal_id。自然這樣不太好,因為在一個(gè)文件夾中只能有一個(gè)實(shí)例。但,嗨 ... 這是最小的 ... 記得嗎?

然而最后一個(gè)方法存在一個(gè)問(wèn)題。當調用時(shí),它不返回任何值。所以當這個(gè)方法被調用時(shí),瀏覽器會(huì )顯示些什么呢??你猜一猜。什么都沒(méi)有!或者當你已經(jīng)放開(kāi)選擇框來(lái)增加實(shí)例時(shí),只是看上去什么都沒(méi)有發(fā)生。真掃興。很自然我應增加某種返回頁(yè)面,但是這對于一個(gè)最小產(chǎn)品來(lái)說(shuō)太麻煩了。我將只是讓瀏覽器重定向到index_html。

“redirect()”方法存在于RESPONSE對象中,并且每次Zope調用一個(gè)方法時(shí),RESPONSE都作為一個(gè)參數傳給方法。所以很容易得到它。它應該正好被加入到方法的參數列表中。(這種用法與.asp的方法相比不同之處為在.asp中“Response”是一個(gè)全局對象。)

但不管怎么樣,類(lèi)現在完成了,并且看上去象這樣:

from OFS import SimpleItem

class minimal(SimpleItem.SimpleItem):

"minimal object"

meta_type = ‘minimal‘ # this is the same for all
# instances of this class
# so it‘s declared here and
# not in "__init__()"

def __init__(self, id):
"initialise a new instance of Minimal"
self.id = id # And this little fella is NOT optional

def index_html(self):
"used to view content of the object"
return ‘<html><body>Hello World</body></html>‘

    def manage_addMinimal(self):
"Add a Minimal to a folder."
self._setObject(‘minimal_id‘, minimal(‘minimal_id‘))
RESPONSE.redirect(‘index_html‘)
現在我只需要將它放入一個(gè)Python包中,并且把這個(gè)包放到我的Zope安裝中的正確目錄中去即可。

我的包叫做minimal,結構為:

minimal
minimal.py
__init__.py
創(chuàng )建包
現在所要做的是使用某種方法通知Zope這個(gè)包是一個(gè)Zope產(chǎn)品,并且當某人放開(kāi)選擇框向一個(gè)文件夾添加實(shí)例時(shí),Zope需要知道調用哪個(gè)方法來(lái)實(shí)現添加。我知道,你也知道是“manage_addMinimal()”,但是Zope不知道。我們使用在包中叫做__init__.py的文件來(lái)告訴Zope所有這一切:

import minimal

def initialize(context):
"""Initialize the minimal product.
This makes the object apear in the product list"""
context.registerClass(
minimal.minimal,
constructors = (
minimal.manage_addMinimal, # This is called when
# someone adds the product
)
)
首先我從minimal.py中導入minimal,這么做是因為minimal被用在了“initialize()”方法中。

“initialize()”方法是當啟動(dòng)Zope服務(wù)器時(shí)由Zope來(lái)調用的。這就是為什么我們需要重新啟動(dòng)Zope來(lái)安裝一個(gè)新產(chǎn)品的原因。

Zope傳遞“context”類(lèi)給“initialize()”。然后“context.registerClass()”通過(guò)將 “minimal”作為第一個(gè)傳給它的參數在Zope中注冊類(lèi)。第二個(gè)參數是從minimal模塊來(lái)的方法元組(tuple),它們被用作構造器。構造器是這樣的方法,它們向文件夾添加實(shí)例。并且你應該記得它是“manage_addMinimal()”。記住不要在方法名字后面加小括號。我們不想讓方法被執行,只是想告訴Zope是什么方法。這就是將“manage_addMinimal”方法綁定到objectManager上去的地方。

通常使用一個(gè)表格來(lái)添加產(chǎn)品,但是我不在這里那樣做。因為那樣不會(huì )是最小的。關(guān)于這一點(diǎn)后面再詳細講。

這就是一個(gè)我能想到的具有全部Zope產(chǎn)品功能的最小的類(lèi)。當然它仍然十分粗糙,但是它就是編寫(xiě)一個(gè)類(lèi)所需要的全部知識了。這個(gè)類(lèi)可以具有象.asp或.php一樣的功能。它沒(méi)有持續(persistence),沒(méi)有安全或用戶(hù)管理。只是象其它那些產(chǎn)品。

但這些只是Zope冰山之一角。實(shí)現對象的持續現在相當容易,你不需要額外的數據庫來(lái)存放數據。當在不同的文件夾中加入產(chǎn)品的同一實(shí)例時(shí),這一點(diǎn)特別好。它們會(huì )自動(dòng)保存實(shí)例的值,并且使得重用更容易。

Zope可能不十分象.asp或.php一樣容易,但我想說(shuō)它也是“陡峭的學(xué)習曲線(xiàn)”(譯注:好象是說(shuō)越往后往簡(jiǎn)單)。Zope在創(chuàng )建web應用程序時(shí)有大量的好處,而其它工具則沒(méi)有。盡管Zope看上去復雜,這是因為它對其它工具考慮得更多的緣故。

想象一下當使用其它工具為你的某個(gè)客戶(hù)建立一個(gè)討論區的情形吧。你創(chuàng )建應用。到目前為止還很好。但是現在你想要為另一個(gè)客戶(hù)重用它。也許是你的老板要你這么做的。這不是什么好消息,因為你的html和代碼結合的很緊密。所以你幾乎需要為新的客戶(hù)重新編寫(xiě)。

突然,有某個(gè)人在討論區中使用了“轉貼”。所以你的客戶(hù)想要能夠刪除注解。但管理頁(yè)面應該被隱藏在一個(gè)口令之后。所以你創(chuàng )建了一個(gè)簡(jiǎn)單的口令系統,并且在一個(gè)會(huì )話(huà)(session)變量中保存用戶(hù)名。不錯 ... 現在每個(gè)人都高興了。

直至老客戶(hù)也想要同樣的管理功能和口令保護。哦,是的,貼新文件的方式也是口令保護的,但在討論區中允許貼新貼與刪除消息是不一樣的,所以某些更高級的用戶(hù)管理表格需要創(chuàng )建。

哦,順便提一下用戶(hù)已經(jīng)買(mǎi)下了一家在德國的公司,它有著(zhù)自已的討論區和新聞工具。

這類(lèi)事情在做web應用時(shí)是很典型的。有時(shí)候你將需要Zope已經(jīng)內置這些功能。但是因為Zope內置了這些功能,這樣就比起“原始”工具如“mod_perl”,“.asp”和“.php”看上去難得多。

“minimal”類(lèi)的兩個(gè)最終文件
__init__.py:

import minimal

def initialize(context):
"""Initialize the minimal product.
This makes the object apear in the product list"""
context.registerClass(
minimal.minimal,
constructors = (
minimal.manage_addMinimal, # This is called when
# someone adds the product
)
)


minimal.py:

from OFS import SimpleItem

class minimal(SimpleItem.SimpleItem):

"minimal object"

meta_type = ‘minimal‘

def __init__(self, id):
"initialise a new instance of Minimal"
self.id = id

def index_html(self):
"used to view content of the object"
return ‘<html><body>Hello World</body></html>‘

def manage_addMinimal(self, RESPONSE):
"Add a Minimal to a folder."
self._setObject(‘minimal_id‘, minimal(‘minimal_id‘))
RESPONSE.redirect(‘index_html‘)
就是這些了。我現在已經(jīng)編寫(xiě)了一個(gè)最小類(lèi),它可以被用來(lái)開(kāi)發(fā)其它的類(lèi)。

minimal類(lèi)的一些簡(jiǎn)單增強
改善minimal類(lèi)的最明顯的方法是當增加一個(gè)實(shí)例時(shí)能夠修改id。為了做到這一點(diǎn),我需要增加一個(gè)表格到minimal,這樣當用戶(hù)放開(kāi)選擇框時(shí),他們就可以輸入一個(gè)id。

class minimal(SimpleItem.SimpleItem):

"minimal object"

meta_type = ‘minimal‘

def __init__(self, id):
"initialise a new instance of Minimal"
self.id = id

def index_html(self):
"used to view content of the object"
return ‘<html><body>Hello World</body></html>‘

def manage_addMinimal(self, id, RESPONSE=None):
"Add a Minimal to a folder."
self._setObject(id, minimal(id))
RESPONSE.redirect(‘index_html‘)

def manage_addMinimalForm(self):
"The form used to get the instance‘ id from the user."
return """<html>
<body>
Please type the id of the minimal instance:
<form name="form" action="manage_addMinimal">
<input type="text" name="id">
<input type="submit" value="add">
</form>
</body>
</html>"""
由“manage_addMinimalForm()”返回的html表格在提交后會(huì )調用“manage_addMinimal()”。“id”被作為一個(gè)參數傳遞。

但我也需要修改“manage_addMinimal()”,因為它需要使用id。所以將使用固定的“minimal_id”改為現在使用用戶(hù)在文本框中輸入的內容作為一個(gè)id?,F在在文件夾中可以有任意數量的實(shí)例了,只要它們有著(zhù)不同的id。

我也修改了__init__.py,因為當添加一個(gè)實(shí)例時(shí),Zope現在需要調用“manage_addMinimalForm()”,而不是“manage_addMinimal()”。

import minimal

def initialize(context):
"""Initialize the minimal product.
This makes the object apear in the product list"""
context.registerClass(
minimal.minimal,
constructors = (
minimal.manage_addMinimalForm, # The first method is
# called when someone
# adds the product
minimal.manage_addMinimal
)
)
最后最后要說(shuō)的
仍然還有一個(gè)小問(wèn)題。當向一個(gè)文件夾中添加產(chǎn)品的一個(gè)實(shí)例時(shí),我可以看到對象id,如果我在上面點(diǎn)擊,我進(jìn)入到產(chǎn)品的管理屏幕。唯一的問(wèn)題是我還沒(méi)有定義這樣一個(gè)屏幕。所以當進(jìn)入到minimal_id/manage_workspace時(shí),Zope給我一個(gè)錯誤。它對于實(shí)例的工作沒(méi)有什么影響。只是看上去有些粗糙。通過(guò)向類(lèi)中增加一個(gè)“manage_options”的元組可以避免:

manage_options = (
{‘label‘: ‘View‘, ‘a(chǎn)ction‘: ‘index_html‘},
)
在管理視圖中將會(huì )有一個(gè)單個(gè)的tab頁(yè),叫做“view”,并且作為缺省的它將進(jìn)入index_html。所以當某人點(diǎn)擊在文件夾中的實(shí)例的鏈接時(shí),他們將看到“index_html”。這樣就沒(méi)有不確切的尾巴了。

那么最終的類(lèi)看上去象這樣:

class minimal(SimpleItem.SimpleItem):

"minimal object"

meta_type = ‘minimal‘

manage_options = (
{‘label‘: ‘View‘, ‘a(chǎn)ction‘: ‘index_html‘},
)

def __init__(self, id):
"initialise a new instance of Minimal"
self.id = id

def index_html(self):
"used to view content of the object"
return ‘<html><body>Hello World</body></html>‘

def manage_addMinimal(self, id, RESPONSE=None):
"Add a Minimal to a folder."
self._setObject(id, minimal(id))
RESPONSE.redirect(‘index_html‘)

def manage_addMinimalForm(self):
"The form used to get the instance‘ id from the user."
return """<html>
<body>
Please type the id of the minimal instance:
<form name="form" action="manage_addMinimal">
<input type="text" name="id">
<input type="submit" value="add">
</form>
</body>
</html>"""
向產(chǎn)品增加更多的頁(yè)或方法
我將加入一些額外的東西演示如何向類(lèi)中加入更多的方法。在這里我已經(jīng)加入了三個(gè)方法“counter”,“squareForm”和“square”。試著(zhù)理解它們是如何工作的。比起mod_perl,.asp或.php沒(méi)有太多的區別。

from OFS import SimpleItem

class minimal(SimpleItem.SimpleItem):

"minimal object"

meta_type = ‘minimal‘

manage_options = (
{‘label‘: ‘View‘, ‘a(chǎn)ction‘: ‘index_html‘},
)

def __init__(self, id):
"initialise a new instance of Minimal"
self.id = id

def index_html(self):
"used to view content of the object"
return ‘<html><body>Hello World</body></html>‘

def counter(self):
"Shows the numbers from 1 to 10"
result = ‘<html><body>Counts from from 0 to 10\n‘
for i in range(10):
result = result + str(i) + ‘\n‘
result = result + ‘</body></html>\n‘
return result

def squareForm(self):
"User input form for the suare method"
return """<html>
<body>
Please type the number you want squared:
<form name="form" action="square">
<input type="text" name="value:int">
<input type="submit" value="Square">
</form>
</body>
</html>"""

def square(self, value=0):
"Returns the input value squared"
return """<html><body><b>The result of %s squared is:</b>
%s</body></html>""" % (str(value), str(value*value))

# Administrative pages

def manage_addMinimal(self, id, RESPONSE=None):
"Add a Minimal to a folder."
self._setObject(id, minimal(id))
RESPONSE.redirect(‘index_html‘)

def manage_addMinimalForm(self):
"The form used to get the instance‘ id from the user."
return """<html>
<body>
Please type the id of the minimal instance:
<form name="form" action="manage_addMinimal">
<input type="text" name="id">
<input type="submit" value="add">
</form>
</body>
</html>"""
最后
我希望這個(gè)How-To有些幫助。當然在這里我所做的不是Zope通常使用的方法。但是我是想把這個(gè)How-To做為一個(gè)基本的關(guān)于產(chǎn)品創(chuàng )建的介紹,它可以用來(lái)解釋zope的其它部分,通過(guò)從這個(gè)例子進(jìn)行擴展。


--------------------------------------------------------------------------------
[注1] 這里對Mixin的解釋好象不對,似乎應該是在運行時(shí)對類(lèi)的基類(lèi)進(jìn)行重定義,從而使新生成的類(lèi)實(shí)例具有新的屬性和方法。關(guān)于這一點(diǎn),本人有一篇文章,可以看一下?!禡ix-in技術(shù)介紹》
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
怎么用Python爬取抖音小視頻? 資深程序員都這樣爬取的(附源碼)
__init__和__del__
全網(wǎng)目前最全python例子(附源碼)
1分鐘升級python3自帶http服務(wù)器支持文件上傳
[Python]WebPy學(xué)習筆記
python中的other.a怎么理解?
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久