使用CGI部署Flask应用程序

问题描述:

我已经使用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

为了完整起见,在上述评论之后发布了答案。

如上所述,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。

这个问题是三岁,从来没有被标记为答案。如果您正在寻找关于如何操作的完整讨论,请参阅我最近发布的this related * question。它应该适合你。

当然mkriheli有正确的想法; monostop不应该尝试运行cgi文件(让服务器响应传入的HTTP请求执行此操作)。

+0

确实,http://*.com/a/24848407/2371522为我工作。 – One

我会尽量表现出我做了什么,它工作在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文件。