在1&1共享主机上部署烧瓶应用程序(使用CGI)

Seb*_*tel 9 python cgi flask

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

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

我试过这个教程:通过CGI烧瓶

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

亲切的问候,塞巴斯蒂安

Mik*_*nor 17

我写了近一年之后提供答案,因为给出的答案是不完整的,因为建议放弃/ $ 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 )
Run Code Online (Sandbox Code Playgroud)

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

我在这里徘徊的时间部分是由于我读到的关于这个主题的所有无用的帖子,但主要是因为我没有尽早获得错误消息的业务.(我可以访问ISP提供的错误日志,但它很少有帮助.)

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

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

此外,您可以简单地使用print语句,CGI上引用的Flask文档说明了这些语句:

  • 使用CGI,您还必须确保您的代码不包含任何print语句,或者sys.stdout被不写入HTTP响应的内容覆盖.

这是真的,但它是有帮助的,同时调试看到打印写入到HTTP响应.

最后,当我最终得到它时,浏览器的位置框遗憾地有像www.mysite.com/scgi-bin/moc/cgiappserver-prod.cgi/contact这样的东西,而我真的只需要www.mysite.com /联系.

解决方法是cgiappserver-prod.cgi中的ScriptNameStripper类.我是从其他Flask文档中得到的.


Seb*_*tel 3

我找到了解决办法!我离开了/$1我的.htaccess并修改了一点 werkzeug,因为 CGI 中的环境变量的命名与 WSGI 应用程序中的有点不同。我将通知 werkzeug 开发人员,也许他会将我的解决方案包含到 werkzeug 中。

  • 您对 werkzeug 进行了哪些修改? (3认同)