在Bluehost上部署Flask的问题

1 投票
1 回答
3448 浏览
提问于 2025-04-18 03:48

我一直在阅读这篇指南,想在Bluehost上部署Flask,但一直没能成功。

这是我在虚拟环境(venv)中安装的包:

Flask           - 0.10.1       - active 
Jinja2          - 2.7.2        - active 
MarkupSafe      - 0.21         - active 
Python          - 2.7.3        - non-active development (/usr/local/lib/python2.7/lib-dynload)
Python          - 2.7.6        - active development (/usr/local/lib/python2.7/lib-dynload)
Werkzeug        - 0.9.4        - active 
flup            - 1.0.2        - active 
itsdangerous    - 0.24         - active 
pip 1.5.4 has no metadata
setuptools 2.2 has no metadata
wsgiref         - 0.1.2        - active development (/usr/local/lib/python2.7)
yolk            - 0.4.3        - active

我在public_html中的.htaccess文件:

Options +ExecCGI
AddHandler fcgid-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ flask_hello_world.fcgi/$1 [QSA,L]

flask_hello_world.fcgi文件,也在public_html中:

    #!/home/REDACTED/venv/flask_hello_world/bin/python

    from flup.server.fcgi import WSGIServer
    from flask_hello_world_app import app as application

    WSGIServer(application).run()

flask_hello_world_app.py文件,也在public_html中:

from datetime import datetime
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

@app.route('/the-time')
def the_time():
     cur_time = str(datetime.now())
     return cur_time + ' is the current time!  ...YEAH!'

if __name__ == '__main__':
    app.run()

执行flask_hello_world.fcgi时的输出如下:

WSGIServer: missing FastCGI param REQUEST_METHOD required by WSGI!
WSGIServer: missing FastCGI param SERVER_NAME required by WSGI!
WSGIServer: missing FastCGI param SERVER_PORT required by WSGI!
WSGIServer: missing FastCGI param SERVER_PROTOCOL required by WSGI!
Status: 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 12

Hello World!Unhandled exception in thread started by 
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by 
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by 
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by 
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by 
sys.excepthook is missing
lost sys.stderr

用Python解释器执行flask_hello_world.fcgi时的输出如下:

  Traceback (most recent call last):
  File "flask_hello_world.fcgi", line 4, in <module>
    from flask_hello_world_app import app as application
  File "/home/REDACTED/public_html/flask_hello_world/flask_hello_world_app.py", line 2, in <module>
    from flask import Flask
  File "/usr/lib/python2.6/site-packages/flask/__init__.py", line 19, in <module>
    from jinja2 import Markup, escape
ImportError: No module named jinja2

Apache的错误日志如下:

[Tue Apr 22 19:56:19 2014] [warn] [client xxx] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server
[Tue Apr 22 19:56:19 2014] [error] [client xxx] Premature end of script headers: flask_hello_world.fcgi
[Tue Apr 22 19:56:19 2014] [error] [client xxx] exec used but not allowed in /home/REDACTED/public_html/500.shtml

我之前成功部署过Flask,所以现在有点不知所措。我想我可能漏掉了什么简单的东西,任何帮助都将不胜感激。


补充:我发现是权限/所有权的问题,是通过检查suexec日志找到的。

1 个回答

3

除了检查Jinja2是否真的安装之外,我猜测你的mod_wsgi可能找不到你的虚拟环境。这可以解释为什么会出现Jinja2环境错误。

mod_wsgi(Apache)部署文档的最底部,有这样一段话:

如果你想在mod_wsgi中使用虚拟环境,你需要稍微修改一下你的.wsgi文件。

在你的.wsgi文件的顶部添加以下几行:

activate_this = '/path/to/env/bin/activate_this.py'

execfile(activate_this, dict(file=activate_this))

这会根据虚拟环境的设置来设置加载路径。请记住,路径必须是绝对路径。

撰写回答