据我了解,Apache mod_wsgi 实现了一个与 Apache 一起运行并提供 CGI 请求的 python 解释器,但是 WSGI 和 CGI 之间的区别在于,对于 WSGI,只要 Apache 服务器正在运行,Python 会话就会一直运行,而对于 CGI 它每次服务器收到 CGI 请求时都必须重新启动。
我想知道的是,是否有一个 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)
我可以通过键入 python myapp.py 来运行它,但它会启动自己的 Web 服务器。相反,我希望 Apache 成为 Web 服务器,但我希望能够打开一个交互式 python shell 并键入from myapp import *
并让应用程序监听来自 Apache 的请求,因为我有我的交互式 shell,所以我可以做一些事情喜欢print app.apples
或app.apples = 50
什么的。我说我希望我的网络应用程序与网络服务器分开,并与 python shell 交互。
我的意思app.apples
是它是一个全局变量,就像访问次数的命中计数'/'
一样,只要应用程序正在运行,它就会一直存在。
编辑2:
这是另一个例子。
我的应用程序.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。有没有办法以非阻塞方式运行服务器,以便我可以使用交互式 shell?