根據我的理解,Apache mod_wsgi實現了一個與Apache一起運行並提供CGI請求的python解釋器,但是WSGI和CGI之間的區別在於,只要Apache服務器正在運行,使用WSGI,Python會話就會一直運行,而每次服務器獲取CGI請求時,都必須重新啓動CGI。Python模塊偵聽來自Apache的WSGI請求?
我想知道的是,是否有一個Python模塊可以與Apache分開運行,就像在交互式Python會話中那樣,它將監聽來自Apache的CGI請求?因此,例如,您可以讓Apache運行並且WSGI中間件不運行,然後您可以啓動交互式Python會話並導入您的WSGI中間件模塊,然後它將提供來自Apache的CGI請求,您也可以關閉它,而無需關閉Apache。所以它是一個像Apache mod_wsgi這樣的單一會話,但它不一定總是與Apache同時運行,並且您可以從交互式Python會話中運行它。
編輯1:
因此,舉例來說,我有這個燒瓶應用,myapp.py:
from flask import Flask
app = Flask(__name__)
app.debug = True
app.apples = 0
@app.route('/')
def hello():
app.apples += 1
return 'blah: %d' % app.apples
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
而且我可以通過鍵入蟒蛇myapp.py運行它,但它開始了自己的網站服務器。相反,我希望Apache成爲Web服務器,但我希望能夠打開一個交互式python shell並鍵入from myapp import *
並讓應用程序監聽來自Apache的請求,並且由於我有我的交互式shell,所以我可以做像print app.apples
或app.apples = 50
或其他什麼的東西。我在說我希望我的web應用程序與web服務器分開,並與python shell交互。
我的意思是與app.apples
說的是它是一個全局變量,就像訪問次數爲'/'
的點擊次數一樣,只要應用程序正在運行,它就會一直存在。
編輯2:
這是另一個例子。
myapp.py:
import web
def add_global_hook():
g = web.storage({"counter": 0})
def _wrapper(handler):
web.ctx.globals = g
return handler()
return _wrapper
class Hello:
def GET(self):
web.ctx.globals.counter += 1
return "<h1>Counter: %d</h1>" % web.ctx.globals.counter
urls = ("/", "Hello")
app = web.application(urls, globals())
app.add_processor(add_global_hook())
app.run()
在這裏,我可以打開一個Python解釋器,然後輸入from myapp import *
,並啓動Web服務器,但Web服務器正在運行時,我從使用交互式受阻貝殼。有沒有辦法以非阻塞的方式運行服務器,以便我可以使用交互式shell?
這將有助於如果你可以編輯,並解釋爲什麼你想這一點 - 也許這將挑起一些好的想法。 – gahooa
這可能對於在出現問題時調試apache + wsgi設置很有用。另外,我可以在調試wsgi應用程序時看到一些用途,並且通常用於提供wsgi的repl。 – jhonkola
是的,我希望它能夠進行調試,並且我想讓Apache與交互式會話分開運行,所以我可以單獨關閉Apache,但仍然有交互式會話 - 所以我可以進行修改或任何其他操作 - 然後啓動Apache備份。 –