0

据我了解,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.applesapp.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?

4

3 回答 3

2

您是否考虑过使用 Apache 作为前端代理运行 gunicorn WSGI 服务器?

如果你想要调试一个实时的 Python Web 应用程序而不需要做任何太复杂的事情,还可以看看:

https://github.com/GrahamDumpleton/wsgi-shell

如果使用 mod_wsgi,您只想确保在默认的单个守护进程中使用 mod_wsgi 守护模式。

顺便说一句,您对 mod_wsgi 工作原理的理解有点错误,但与其尝试和纠正,不如说它只会帮助您更好地解释为什么要做您想做的事情。也许从提出实际问题而不是您认为的解决方案开始。

于 2012-06-01T02:18:56.637 回答
0

我正在考虑同样的问题,因为我无法弄清楚为什么某些 DLL 在 Windows+Apache 2.2+mod_wsgi 下无法加载。(在我的情况下,当 Python 的 Shapely 库尝试加载“geos_c.dll”时出现问题。)

我正在考虑的解决方法是运行一个独立的 WSGI 应用程序,比如在端口 81 上,该应用程序对于直接发送到该端口的所有请求都可以正常工作。然后,将 Apache 配置为代理该端口,例如:

ProxyPass /wsgi/myapp http://127.0.0.1:81
ProxyPassReverse /wsgi/myapp http://127.0.0.1:81

有一些你担心的事情:

  • 内置的 WSGI 服务器不是多线程的(所以你放弃了在 Apache 后面使用 WSGI 的一大优势)
  • 您的独立 Python WSGI 服务器需要在控制台中启动(意外关闭它会杀死您的应用程序 - 消除 Apache WSGI 的另一个优势,它将应用程序作为服务提供,无需控制台且没有人登录)
于 2013-07-16T15:34:24.020 回答
0

Python 在模块中有一个内置的 wsgi 服务器wsgiref,适用于开发和测试目的,但可能不适合生产用途。例如,使用还提供的示例 wsgi 应用程序:

>>> import wsgiref.simple_server
>>> server = wsgiref.simple_server.make_server('0.0.0.0', 8888, wsgiref.simple_server.demo_app)
>>> server.serve_forever()
127.0.0.1 - - [21/Jul/2016 00:44:04] "GET / HTTP/1.1" 200 2664
127.0.0.1 - - [21/Jul/2016 00:44:05] "GET /favicon.ico HTTP/1.1" 200 2615
127.0.0.1 - - [21/Jul/2016 00:44:05] "GET /favicon.ico HTTP/1.1" 200 2675
^CTraceback (most recent call last):
  File "<ipython-input-5-30934a6743d8>", line 1, in <module>
    server.serve_forever()
  File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 236, in serve_forever
    poll_interval)
  File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 155, in _eintr_retry
    return func(*args)
KeyboardInterrupt

>>> 
于 2016-07-21T04:45:52.980 回答