我写信是在将近一年后提供一个答案,因为给定的答案不完整,并且因为省略 /$1 的建议是错误的。使用字符串“deploy flask on cgi”通过 Internet 搜索可以访问的其他 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,它有一个 CGI 包装器,他们称之为“scgi”。不幸的是,这不是真的。因此,出于运行 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 /接触。
解决方法是 cgiappserver-prod.cgi 中的 ScriptNameStripper 类。我从其他 Flask 文档中得到它。