【发布时间】:2023-12-28 05:19:01
【问题描述】:
据我了解,Apache mod_wsgi 实现了一个 python 解释器,它与 Apache 一起运行并服务于 CGI 请求,但 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 之类的东西。我是说我希望我的 web 应用程序与 web 服务器分开,并与 python shell 交互。
我对@987654325@ 的意思是,它是一个全局变量,就像访问'/' 的次数一样,只要应用程序正在运行,它就会一直存在。
编辑 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。有没有办法以非阻塞方式运行服务器,以便我可以使用交互式 shell?
【问题讨论】:
-
如果你能编辑并解释你为什么想要这个会有所帮助——也许这会激发一些好主意。
-
这对于调试 apache+wsgi 设置可能很有用,以防出现问题。此外,我可以看到在调试 wsgi 应用程序方面的一些用途,并且通常用于为 wsgi 提供 repl。
-
是的,我希望它用于调试,并且我想让 Apache 与交互式会话分开运行,所以我可以单独关闭 Apache,但仍然有交互式会话 - 所以我可以进行修改或其他任何事情 - 然后启动 Apache 备份。
标签: python apache mod-wsgi wsgi