2012-05-31 106 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 

>>> 
相關問題