2012-03-13 56 views
14

我有我的Apache服務器的設置,它是通過處理的mod_wsgi瓶響應。我已經通過該別名註冊的WSGI腳本:如何在Apache和mod_wsgi中使用Flask路由?

[httpd.conf中]

WSGIScriptAlias /service "/mnt/www/wsgi-scripts/service.wsgi" 

我已經添加了相應的WSGI文件在上述路徑:

[/ MNT /網絡/ WSGI的腳本/ service.wsgi]

import sys 
sys.path.insert(0, "/mnt/www/wsgi-scripts") 

from service import application 

而且我有一個簡單的測試瓶Python腳本,所提供的服務模塊:

[/mnt/www/wsgi-scripts/service.py]

from flask import Flask 

app = Flask(__name__) 

@app.route('/') 
def application(environ, start_response): 
     status = '200 OK' 
     output = "Hello World!" 
     response_headers = [('Content-type', 'text/plain'), 
          ('Content-Length', str(len(output)))] 
     start_response(status, response_headers) 
     return [output] 

@app.route('/upload') 
def upload(environ, start_response): 
     output = "Uploading" 
     status = '200 OK' 
     response_headers = [('Content-type', 'text/plain'), 
          ('Content-Length', str(len(output)))] 
     start_response(status, response_headers) 
     return [output] 

if __name__ == '__main__': 
     app.run() 

當我去我的網站URL [主機名] /服務能夠正常運行,我得到的 「Hello World!」背部。問題是我不知道如何讓其他路線工作,如上例中的「上傳」。這在獨立燒瓶中正常工作,但在mod_wsgi下我很難過。我能想象的唯一事情就是爲每個我想要的端點在httpd.conf中註冊一個單獨的WSGI腳本別名,但這會帶走Flask的奇特路由支持。有沒有辦法做到這一點?

+3

你試過瀏覽到'/ service/upload'嗎?你可能會感到驚喜。 – 2012-03-13 08:28:19

+0

當我打/ /服務/上傳請求仍然被髮送到'應用程序'功能。實際上,我可以在應用程序功能之前刪除路由語句,它仍然有效。這就像應用程序總是被mod_wsgi用作應用程序的入口點。感覺就像我需要在'應用程序'裏面做一些啓動Flask路由邏輯的事情。 – 2012-03-13 14:52:33

回答

17

在你的wsgi文件中你正在做from service import application,它只導入你的application方法。

將其更改爲from service import app as application,並且所有內容均按預期工作。

您的評論後,我想我會擴大回答一下:

你的WSGI文件是Python代碼 - 你可以有這個文件中的任何有效的Python代碼。安裝在Apache中的wsgi「處理程序」正在查找此文件中的名稱,它將將請求傳遞給該文件。 Flask類實例 - app = Flask(__name__) - 提供了這樣一個接口,但是因爲它的名稱爲app而不是application,所以在導入它時必須將其別名 - 這就是from行的作用。

你可以 - 這非常好 - 只需做到application = Flask(__name__),然後將Apache的wsgi處理程序指向你的service.py文件。如果service.py是可導入的(也就是說,在PYTHONPATH的某處),則不需要中介wsgi腳本。

雖然上述工作,其不良做法。 wsgi文件需要Apache進程的權限才能工作;而且你通常將它從實際的源代碼中分離出來,這些源代碼應該在文件系統的其他地方,並具有適當的權限。

+0

做到了。謝謝!除了更改service.wsgi以符合您的指示外,我還需要將我的service.py恢復爲純粹的燒瓶。在最初的問題陳述中,我想我已經擺脫了將純粹的mod_wsgi代碼與Flask混合在一起的軌道。我認爲這種混亂的起因是命名我的根路由處理程序「應用程序」。 – 2012-03-13 15:28:37

+1

我認爲我不清楚mod_wsgi與Flask代碼。我知道這都是Python。我遇到的問題是,在上面的示例中,我的'@ app.route('/')'正在裝飾函數'application'。在我原來的設置中,我只導入了應用程序,所以只有這個函數被調用。當我更改_service.wsgi_以使用'從服務導入應用程序作爲應用程序'時,它確實引用了Flask對象,但它似乎也與'application'函數產生了命名衝突。我將此函數重命名爲'@def root():',現在它工作正常。再次感謝! – 2012-03-13 15:53:28

+0

甜!這是我的困境的答案。 – 2015-03-14 17:54:24

相關問題