2011-09-06 211 views
8

我已經使用Flask框架編寫了一個小應用程序。我嘗試使用cgi來承載這個。繼文檔我創建了以下內容的CGI文件:使用CGI部署Flask應用程序

#!/usr/bin/python 
from wsgiref.handlers import CGIHandler 
from yourapplication import app 

CGIHandler().run(app) 

運行在下面的錯誤文件的結果:

...

File "/usr/lib/pymodules/python2.7/werkzeug/routing.py", line 1075, in bind_to_environ wsgi_server_name = environ.get('HTTP_HOST', environ['SERVER_NAME'])
KeyError: 'SERVER_NAME'
Status: 500 Internal Server Error
Content-Type: text/plain
Content-Length: 59

在我的應用程序已經設置:

app.config['SERVER_NAME'] = 'localhost:5000' 

當我使用Flask開發服務器運行應用程序時,它可以工作非常好。 正如你可以告訴我這個東西很新,我有搜索其他類似的錯誤,但沒有運氣。所有的幫助表示讚賞。

+1

你在一些http服務器下運行它嗎?這些環境變量應該由執行cgi的http服務器設置。 – mkriheli

+0

感謝您的評論。我運行Apache主機。我不認爲我需要配置服務器只是爲了在本地運行命令。在完成所需的配置後,我會再試一次。 – monostop

+0

你能解決這個錯誤嗎? – Shadkhan

回答

0

爲了完整起見,在上述評論之後發佈了答案。

如上所述,cgi腳本應該由某個服務器執行。這裏的抽象from CGI 1.1 RFC

The Common Gateway Interface (CGI) is a simple interface for running external programs, software or gateways under an information server in a platform-independent manner. Currently, the supported information servers are HTTP servers.

對於環境變量(人失蹤,並引發錯誤)請參閱sectuib 4.1的RFC。

2

這個問題是三歲,從來沒有被標記爲答案。如果您正在尋找關於如何操作的完整討論,請參閱我最近發佈的this related stackoverflow question。它應該適合你。

當然mkriheli有正確的想法; monostop不應該嘗試運行cgi文件(讓服務器響應傳入的HTTP請求執行此操作)。

+0

確實,http://stackoverflow.com/a/24848407/2371522爲我工作。 – One

0

我會盡量表現出我做了什麼,它工作在GoDaddy的共享主機帳號:

在MYSITE文件夾中的cgi-bin文件夾,添加以下CGI文件:

#!/home/USERNAME/.local/bin/python3 
from wsgiref.handlers import CGIHandler 

from sys import path 
path.insert(0, '/home/USERNAME/public_html/MYSITE/') 
from __init__ import app 

class ProxyFix(object): 
    def __init__(self, app): 
     self.app = app 

    def __call__(self, environ, start_response): 
     environ['SERVER_NAME'] = "" 
     environ['SERVER_PORT'] = "80" 
     environ['REQUEST_METHOD'] = "GET" 
     environ['SCRIPT_NAME'] = "" 
     environ['PATH_INFO'] = "/" 
     environ['QUERY_STRING'] = "" 
     environ['SERVER_PROTOCOL'] = "HTTP/1.1" 
     return self.app(environ, start_response) 

if __name__ == '__main__': 
    app.wsgi_app = ProxyFix(app.wsgi_app) 
    CGIHandler().run(app) 

正如你可以看到在MYSITE文件夾中的init文件有燒瓶應用程序。

最重要的是設置權限。我設置了755這個文件夾的權限AS WELL AS到「/home/USERNAME/.local/bin/python3」文件夾!請記住,系統需要此權限才能打開燒瓶。

要打開CGI我在MYSITE文件夾下面的.htaccess文件:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /home/USERNAME/public_html/MYSITE/cgi-bin/application.cgi/$1 [L] 

因此,當有人進入你的頁面就會呈現CGI文件。