2010-01-29 38 views
10

從我可以告訴這是一個簡約的python wsgi開發服務器,支持代碼重載?

  1. 的wsgiref - 無碼重裝
  2. CherryPy的 - 不僅僅是服務器的更多
  3. mod_wsgi的 - 所有的apache的開銷
  4. paste.httpserver - 粘貼是一個巨大的包其他東西在它
  5. flup - 相同的粘貼,太多的東西。
  6. 產卵 - 從未使用它,但似乎足夠輕。
  7. 龍捲風 - 不是真的WSGI +滿 「框架」
  8. WERKZEUG - runco​​mmand

任何人在那裏?哪一個你更喜歡?

+0

Apache並沒有很多聲稱它具有的開銷。如果你正確地配置並正確使用它,大多數人不會這樣做,那麼它就不會像人們發現那樣糟糕。不幸的是,不知不覺的人不斷傳播這個關於Apache臃腫的神話。 :-( – 2010-01-30 02:56:46

+0

)格雷厄姆,請不要誤會我的意思,我真的很喜歡apache,(我認爲)我擅長配置它,我完全同意大多數apache-haters是不知道如何工作的人。然而,我的意圖完全不同,我想爲我的團隊中的其他開發人員提供一個簡單的requirements.txt文件來讓他們運行,然後部署在mod_wsgi中,這樣人們就不必學習和配置他們自己的開發apache實例。 – 2010-01-30 08:41:58

+0

我正在尋找與OP相同的解決方案。FWIW:我的問題是Apache對多個導入的模塊沒有很好的效果 - 比如Shapely。我想繼續開發我的wsgi應用程序(通過重新加載),而我分別調試Apache的問題 – 2013-07-03 13:01:21

回答

4

你可能要看的一個是Werkzeug - 它是一個WSGI實用程序工具包。它包含一個runserver函數,它接受wsgiref服務器並添加自動代碼重新加載(您也可以配置它在配置文件更改時重新加載)以及一個真棒調試器。

在附註中,您對框架的鄙視使得它聽起來像您打算從頭開始處理所有WSGI的東西,在這種情況下,我會建議您使用Werkzeug的實用函數來處理解析請求並生成響應。這比自己做更有趣。 (對於Guido的愛,請不要使用cgi.FieldStorage!)

+0

我沒有什麼其他的框架,事實上,我是TurboGears的一個大貢獻者,他說你需要使用正確的工具來完成這個工作,在這種情況下,安裝粘貼看起來像一個巨大的軟件包,只是爲了測試 – 2010-01-29 12:45:20

+0

好吧,我想我只是誤解了你的措詞。對於那個很抱歉。 – LeafStorm 2010-01-29 22:04:33

+1

晚會之後,但使用cgi.FieldStorage有什麼問題?建議使用'cgi.FieldStorage(fp = environ ['wsgi.input'],environ = environ)'這樣的教程,它可以工作。 – noamtm 2013-04-14 06:07:46

1

到目前爲止,我一直在使用CherryPy,並與Django進行比較(雖然不在您的列表中,但它是我使用的唯一的其他開發服務器)我喜歡它堆得更多。它的確如此說明:只有當你需要時纔會出現,並在剩下的時間裏避開。

使用Django看起來像我需要訂閱Django的做事方式。儘管Django提供了更多的功能(默認管理界面,網頁上的小部件),但使用CherryPy看起來只是另一種導入功能,它具有非常好的功能(通常令人驚訝)。

+2

如果你喜歡cherrypy,那麼你會愛上WebError。這就是說,你似乎在混合「web框架」和「web服務器」。 – 2010-01-29 12:46:48

1

我推薦粘貼或CherryPy。他們是最容易起牀和跑步的人。

1

一個非常簡單的方法是CGI(與常規Web服務器一起使用,並使用wsgiref.handlers.CGIHandler)。生產服務器的性能很差,但對開發很有幫助。您可以編寫一個既可以作爲mod_wsgi WSGIScriptAlias(暴露對象application),又可以作爲mod_cgi ScriptAlias(調用wsgiref,當__name__=='__main__')的單個腳本。

許多WSGI環境都有重新加載基本腳本的方法,例如mod_wsgi的WSGIScriptReloading,默認情況下它處於打開狀態。不幸的是,你可能會將大部分代碼放在模塊中,這很難重新加載。在mod_wsgi中,你也可以通過在守護進程模式下發送SIGINT來執行重新加載來完成。不幸的是,您仍然需要嗅探您用於mtime更新的每個模塊,以瞭解是否需要重新加載。而且它在嵌入式模式下不起作用。

一個混亂但可行的方法是嗅探作爲應用程序一部分的所有模塊,並且如果自上次檢查以來更新了任何模塊,則將其全部重新加載。您必須立即重新加載它們,方法是將它們全部從sys.modules查找中刪除(同時刪除None-評估條目,以避免相對導入查找問題),以確保它們不會交叉引用他們自己的舊版本。當然他們不能在你的應用程序之外留下其他的引用。您可以在ModuleUpdaterhere中看到此示例。 (該軟件尚未準備好發佈,但幾年來一直爲我的WSGI應用程序提供模塊重新加載,並且似乎很穩定。想法是將所有WSGI應用程序都放在一個應用程序類中,你可以從一個單一的WSGI/CGI /命令行入口點腳本導入,您在該腳本部署的配置)

+0

似乎你正在重塑上述所有模塊的功能,例如Spawning實現了代碼重載的算法。這就是說我不打算開始另一個實現。 – 2010-01-29 13:06:38

+0

不完全重塑;我一直在使用這個比Spawning已經存在!與我所知道的不同之處在於,WSGI部署幾乎都是這個模塊的功能;它不會將服務器或應用程序框架拖入等式中。 – bobince 2010-01-29 13:17:13

+0

我不想挑戰,但paste.reloader甚至比Spawning還要舊。 我的原始觀點是,你指向你的代碼,這是不是正式在pypi發佈,你說它是穩定的,但你不會站在那裏(或似乎如此) – 2010-01-30 08:47:54

4

退房從WERKZEUG run_simple:

http://werkzeug.pocoo.org/documentation/0.5.1/serving.html

此外。爲了讓你自動重新加載代碼,你可以使用use_debugger = True來包含他們漂亮的spi在您的應用程序之上使用ffy調試器(其中包括跟蹤每行中的控制檯)。

0

除了其他粘貼模塊,您可以將paste.reloader與任何wsgi-server一起使用。

 
# run paste reloader 
import paste.reloader as reloader 
reloader.install() 

# run wsgiref server 
from wsgiref import simple_server 
simple_server.make_server('', 8080, main_wsgi_app).serve_forever() 

那簡約夠了嗎?

+0

看起來很有希望。但是paste.reloader文檔(http://pythonpaste.org/modules/reloader.html)似乎說你必須把它包裝在一個循環的shell腳本中。換句話說,似乎「reloader」只是在代碼更改時退出server_forever()調用;調用者仍然需要通過循環調用重新加載。是? – 2013-07-03 12:57:32

1

另外,您錯過了web.py,它既小又支持代碼重載。

相關問題