2012-05-31 29 views
0

根据我的理解,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.applesapp.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?

+0

这将有助于如果你可以编辑,并解释为什么你想这一点 - 也许这将挑起一些好的想法。 – gahooa

+0

这可能对于在出现问题时调试apache + wsgi设置很有用。另外,我可以在调试wsgi应用程序时看到一些用途,并且通常用于提供wsgi的repl。 – jhonkola

+0

是的,我希望它能够进行调试,并且我想让Apache与交互式会话分开运行,所以我可以单独关闭Apache,但仍然有交互式会话 - 所以我可以进行修改或任何其他操作 - 然后启动Apache备份。 –

回答

2

是否将您认为运行的gunicorn WSGI服务器与Apache作为前端代理?

如果你是调试活动Python的Web应用程序,而无需做任何事情太复杂的能力后,还看:

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

你只需要确保你使用中的mod_wsgi daemon模式如果使用mod_wsgi,则默认为单个守护进程。

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

+0

我编辑了一个更详细的问题。 –

+0

所以,这里是问题:我如何使Web应用程序与Web服务器分开,并与python shell交互? –

+0

顺便说一句我试过了你的wsgi-shell,但是嵌入式python控制台似乎没有访问我应用程序中的变量。例如,我尝试从嵌入式控制台“打印app.apples”,它告诉我'app'没有被定义,所以也许我误解了嵌入式控制台的目的。 –

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的另一个优势,它将为应用程序提供服务服务w /没有控制台和没有人登录)
0

Python在wsgiref模块中内置了wsgi服务器,适用于开发和测试目的,但可能不适用于生产用途。例如,使用还提供例如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 

>>> 
相关问题