【问题标题】:Deploying a Flask application with CGI [duplicate]使用 CGI 部署 Flask 应用程序 [重复]
【发布时间】:2019-06-14 02:39:07
【问题描述】:

我使用 Flask 框架编写了一个小型应用程序。我尝试使用 cgi 来托管它。根据文档,我创建了一个包含以下内容的 .cgi 文件:

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

CGIHandler().run(app)

运行文件会导致以下错误:

...

bind_to_environ 中的文件“/usr/lib/pymodules/python2.7/werkzeug/routing.py”,第 1075 行 wsgi_server_name = environ.get('HTTP_HOST', environ['SERVER_NAME'])
KeyError:“SERVER_NAME”
状态:500 内部服务器错误
内容类型:文本/纯文本
内容长度:59

在我的应用程序中我设置了:

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

当我使用 Flask 开发服务器运行应用程序时,它运行良好。 正如你所知道的,我对这些东西很陌生,我一直在寻找其他有类似错误但没有运气的人。感谢所有帮助。

【问题讨论】:

  • 你在一些http服务器下运行它吗?这些环境变量应该由执行 cgi 的 http 服务器设置。
  • 感谢您的评论。我正在运行 apache 进行托管。我认为我不需要配置服务器只是为了在本地运行命令。完成所需的配置后,我会再试一次。
  • 这个问题已经存在三年了,从未被标记为已回答。如果您正在寻找关于如何做到这一点的非常完整的讨论,请参阅我最近发给 this related stackoverflow question 的帖子。它应该适合你。当然,mkriheli 的想法是正确的。 monostop 不应该尝试运行 cgi 文件(让服务器这样做以响应传入的 HTTP 请求)。
  • 确实,stackoverflow.com/a/24848407/2371522 为我工作。
  • 你能修复这个错误吗?

标签: python flask cgi


【解决方案1】:

我将尝试展示我所做的并且它在 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['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 以及“/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文件。

【讨论】:

  • 这对于我在共享主机环境中遇到的愚蠢部署情况非常有帮助。确保注释掉或删除 PATH_INFO 行,它可能会干扰您定义的任何 Flask 路由。
  • 编辑并删除了 PATH_INFO
  • 您是要在 RewriteRule 中保留 USERNAME 还是将其替换为您的帐户名?
  • 换成你的账户名
【解决方案2】:

为了完整起见,这是在上面的 cmets 之后作为答案发布的。

如上所述,cgi 脚本应该由某些服务器执行。这是摘要from CGI 1.1 RFC

通用网关接口 (CGI) 是一个简单的运行接口 信息服务器下的外部程序、软件或网关 独立于平台的方式。目前支持的信息 服务器是 HTTP 服务器。

有关环境变量(丢失并触发错误),请参阅 RFC 中的 sectuib 4.1。

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 2010-12-18
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2017-05-04
    相关资源
    最近更新 更多