免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通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)品的編程享有困難的名聲。這不是真的。我相信這只不過是因?yàn)樗菔镜睦釉斐傻?,就象令人討厭的類一樣,展示了太多的特性的緣故。而且這些例子在解釋功能的時(shí)候還跳過了幾個(gè)步驟,使得“Zope”的道路看上去很長并令人厭煩。所有不必要的額外的代碼“只是因?yàn)橐尤?#8221;而被加進(jìn)去了。

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

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

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

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

我的最小的“Hello world”類看上去象這樣:

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

class minimal:

"minimal object"

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

http://localhost:8080/minimal_id/index_html

會(huì)得到“Hello World”的結(jié)果。但是你可以看到,這個(gè)對(duì)象有了一個(gè)叫做“minimal_id”的尋址。它是從哪來的?嗯沒什么地方。但是應(yīng)該很明顯,任何一個(gè)對(duì)象需要一個(gè)id,以便Zope能夠?qū)λ鼘ぶ贰K晕倚枰驅(qū)ο笤黾右粋€(gè)id屬性。我將重復(fù)敘述“任何Zope產(chǎn)品必需擁有一個(gè)叫做id的屬性。否則Zope沒有辦法去調(diào)用它,你將沒有辦法給它一個(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>‘
編寫和使用一個(gè)Zope產(chǎn)品有三個(gè)步驟:

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

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

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

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

我把這個(gè)產(chǎn)品的元類型定為“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一起良好的運(yùn)行,我的類得需要一些基本的功能。通常通過對(duì)一個(gè)叫做“SimpleItem.Item”的類進(jìn)行子類化來實(shí)現(xiàn)。

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

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

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

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è)基類進(jìn)行繼承。一些類提供了某些種類的功能,別一些則提供了另一些。這種混合類的編碼風(fēng)格叫作“mixins”[1],它強(qiáng)大但理解困難。小心一點(diǎn)!

現(xiàn)在我有了一個(gè)完整的類。我僅需要一個(gè)可以將對(duì)象放入一個(gè)文件夾的方法。這可以通過名為“_setObject()”的標(biāo)準(zhǔn)Zope方法來實(shí)現(xiàn)。

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

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

myFolder._setObject(‘minimal‘, minimal(‘minimal_id‘))
僅有“_setObject”是不可能將一個(gè)你的對(duì)象實(shí)例插入到一個(gè)文件夾中去的。必需要調(diào)用它,并給出一些參數(shù)。所以我需要一個(gè)新的方法來做這件事。我叫它為“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‘))
從函數(shù)的作用范圍可以清楚的看到,manage_addMinimal()函數(shù)是從試圖向自身添加minimal產(chǎn)品的文件夾中調(diào)用的。所以換句話說,manage_addMinimal()方法不是屬于“minimal”類的方法,而是屬于“ObjectManager”類的方法。

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

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

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

但不管怎么樣,類現(xiàn)在完成了,并且看上去象這樣:

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‘)
現(xiàn)在我只需要將它放入一個(gè)Python包中,并且把這個(gè)包放到我的Zope安裝中的正確目錄中去即可。

我的包叫做minimal,結(jié)構(gòu)為:

minimal
minimal.py
__init__.py
創(chuàng)建包
現(xiàn)在所要做的是使用某種方法通知Zope這個(gè)包是一個(gè)Zope產(chǎn)品,并且當(dāng)某人放開選擇框向一個(gè)文件夾添加實(shí)例時(shí),Zope需要知道調(diào)用哪個(gè)方法來實(shí)現(xiàn)添加。我知道,你也知道是“manage_addMinimal()”,但是Zope不知道。我們使用在包中叫做__init__.py的文件來告訴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中導(dǎo)入minimal,這么做是因?yàn)閙inimal被用在了“initialize()”方法中。

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

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

通常使用一個(gè)表格來添加產(chǎn)品,但是我不在這里那樣做。因?yàn)槟菢硬粫?huì)是最小的。關(guān)于這一點(diǎn)后面再詳細(xì)講。

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

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

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

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

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

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

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

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

“minimal”類的兩個(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‘)
就是這些了。我現(xiàn)在已經(jīng)編寫了一個(gè)最小類,它可以被用來開發(fā)其它的類。

minimal類的一些簡單增強(qiáng)
改善minimal類的最明顯的方法是當(dāng)增加一個(gè)實(shí)例時(shí)能夠修改id。為了做到這一點(diǎn),我需要增加一個(gè)表格到minimal,這樣當(dāng)用戶放開選擇框時(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ì)調(diào)用“manage_addMinimal()”。“id”被作為一個(gè)參數(shù)傳遞。

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

我也修改了__init__.py,因?yàn)楫?dāng)添加一個(gè)實(shí)例時(shí),Zope現(xiàn)在需要調(diào)用“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
)
)
最后最后要說的
仍然還有一個(gè)小問題。當(dāng)向一個(gè)文件夾中添加產(chǎn)品的一個(gè)實(shí)例時(shí),我可以看到對(duì)象id,如果我在上面點(diǎn)擊,我進(jìn)入到產(chǎn)品的管理屏幕。唯一的問題是我還沒有定義這樣一個(gè)屏幕。所以當(dāng)進(jìn)入到minimal_id/manage_workspace時(shí),Zope給我一個(gè)錯(cuò)誤。它對(duì)于實(shí)例的工作沒有什么影響。只是看上去有些粗糙。通過向類中增加一個(gè)“manage_options”的元組可以避免:

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

那么最終的類看上去象這樣:

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)品增加更多的頁或方法
我將加入一些額外的東西演示如何向類中加入更多的方法。在這里我已經(jīng)加入了三個(gè)方法“counter”,“squareForm”和“square”。試著理解它們是如何工作的。比起mod_perl,.asp或.php沒有太多的區(qū)別。

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有些幫助。當(dāng)然在這里我所做的不是Zope通常使用的方法。但是我是想把這個(gè)How-To做為一個(gè)基本的關(guān)于產(chǎn)品創(chuàng)建的介紹,它可以用來解釋zope的其它部分,通過從這個(gè)例子進(jìn)行擴(kuò)展。


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

聯(lián)系客服