gpt4 book ai didi

python - 在 1&1 共享主机上部署 Flask 应用程序(使用 CGI)

转载 作者:太空狗 更新时间:2023-10-29 19:34:12 24 4
gpt4 key购买 nike

我使用 Flask Web 框架为我的体育俱乐部编写了一个 Web 应用程序。我使用内置测试服务器在本地计算机上完成了所有操作。

知道他们告诉我将其部署在 1&1 共享托管网络空间上。他们有 python 支持,但似乎只允许 CGI 运行 python 脚本。

我试过这个教程:flask via CGI

直到现在我都忽略了重写的东西。对我的 CGI 脚本的所有请求都会导致 404 错误。我修改了应用程序中的 404 处理程序以返回 request.path。当我请求/foo/runserver.cgi/时,它返回/作为输出。我不知道为什么它不提供索引 View 。它不适用于任何 View ,我总是得到 404。

亲切的问候,塞巴斯蒂安

最佳答案

我写信是为了在将近一年后提供一个答案,因为给定的答案是不完整的,而且因为放弃/$1 的建议是错误的。使用字符串“deploy flask on cgi”可以通过互联网搜索找到的其他stackoverflow线程也没有令人满意的解决方案而结束。

首先,我的 .htaccess 文件与引用的“flask via CGI”文档完全相同,只是必须删除第二行中 RewriteCond 的注释,因为在 .htaccess 中任何注释都必须占据整行。

我将 .htaccess 文件放在 public_html 文档根文件夹中,我的 cgi 脚本是/home/myusername/public_html/scgi-bin/moc/cgiappserver-prod.cgi。

当然是 Python,顶部的 shebang 最好是正确的。在我的 ISP,他们使用 cpanel,它有一个他们称之为“scgi”的 CGI 包装器。这不是 the real thing , 很遗憾。因此,出于运行 Flask 的目的,将其视为普通 CGI。

我应该补充一点,我只有一个共享主机帐户。

这是我的 cgiappserver-prod.cgi 文件:

#!/home/myusername/local/bin/python
import cgitb; cgitb.enable() # This line enables CGI error reporting
from wsgiref.handlers import CGIHandler
import traceback
from settings import LGGR

app = None
try:
import moc
app = moc.app
except Exception, e:
LGGR.info( traceback.format_exc([10]) )
LGGR.info( 'Problem in cgiappserver-prod with moc import: %s' % e )

class ScriptNameStripper(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['SCRIPT_NAME'] = ''
return self.app(environ, start_response)

app = ScriptNameStripper(app)

try:
CGIHandler().run(app)
except Exception, e:
LGGR.info( traceback.format_exc([10]) )
LGGR.info( 'Problem in cgiappserver-prod with CGIHandler().run(): %s' % e )

所以我的应用程序分布在几个文件中,上面的代码中特别显示了 setting.py 和 moc.py。

我的失败时间部分是由于我阅读了所有关于这个主题的无用帖子,但主要是因为我没有足够早地处理错误消息。 (我可以访问 ISP 提供的错误日志,但它几乎没有帮助。)

首先,我已确认 cgitb.enable() 函数有效。我故意拼错了 wsgiref 并看到了一个漂亮的错误页面,我注释掉了 cgitb(cgi traceback)行以查看错误消息变成了无用的 500 状态代码。

请注意,我还在 settings.py 中设置了一个记录器,一个旋转文件记录器 LGGR。有了它,我发现我必须做一些额外的事情——这里没有显示——告诉 Python 解释器 sqlite3 库在哪里。

此外,您可以简单地使用打印语句,关于 CGI 上引用的 Flask 文档说:

  • 对于 CGI,您还必须确保您的代码不包含任何打印语句,或者 sys.stdout 被覆盖一些没有写入 HTTP 响应的内容。

确实如此,但在调试时查看打印写入 HTTP 响应时很有帮助

最后,当我最终让它工作时,浏览器的位置框遗憾地包含了 www.mysite.com/scgi-bin/moc/cgiappserver-prod.cgi/contact 之类的东西,而我真的只需要 www. mysite.com/contact.

解决方法是 cgiappserver-prod.cgi 中的 ScriptNameStripper 类。我从other Flask docs得到的.

关于python - 在 1&1 共享主机上部署 Flask 应用程序(使用 CGI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18259435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com