【问题标题】:Flask website -- 500 Internal Server ErrorFlask 网站——500 内部服务器错误
【发布时间】:2023-03-12 23:27:02
【问题描述】:

我一生都无法理解为什么我尝试启动的这个烧瓶应用程序不起作用。我在 5 美元的 Digital Ocean 液滴上运行它。以下是(希望)您需要了解的所有信息:

目录布局(包含在/var/www/内):

FlaskApp
    FlaskApp
        __init__.py
        static
        templates
        venv
    flaskapp.wsgi

__init__.py:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "yay it worked"

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

flaskapp.wsgi:

#!/usr/bin/python
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/FlaskApp/")

from FlaskApp import app as application
application.secret_key = 'Add your secret key'

FlaskApp.conf(包含在/etc/apache2/sites-availble中):

<VirtualHost *:80>
        ServerName the.ip.blah.blah
        ServerAdmin admin@mywebsite.com
        WSGIScriptAlias / /var/www/FlaskApp/flaskapp.wsgi
        <Directory /var/www/FlaskApp/FlaskApp/>
            Order allow,deny
            Allow from all
        </Directory>
        Alias /static /var/www/FlaskApp/FlaskApp/static
        <Directory /var/www/FlaskApp/FlaskApp/static/>
            Order allow,deny
            Allow from all
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

venv 是通过在 /var/www/FlaskApp/FlaskApp/ 中调用 virtualenv venv 创建的。在使用source venv/bin/activate 输入venv 后,我使用pip install flaskvenv 中安装了flask。

Wsgi 已启用 (a2enmod wsgi)。 FlaskApp.conf 已启用 (a2ensite FlaskApp)。最后,我多次重启 apache,但都没有成功 (service apache2 restart)。

我正在关注this 指南,了解如何设置烧瓶应用程序。

这是我的错误的截图:

我们将不胜感激任何有关使其工作的帮助。

提前致谢。

编辑:我发现了问题:ImportError: No module named flask。这有点奇怪,因为我确实在 virtualenv 中做了pip install flask。当我在 virtualenv 中打开一个 python 控制台会话并尝试 import flask 时,我没有收到任何错误,所以不确定发生了什么。

另外,这个应用程序如何使用venv?我看不到它在任何地方都可以访问,所以它是如何使用它的?也许这就是我得到ImportError 的原因,因为我只在 virtualenv 上安装了烧瓶但它没有被使用?

【问题讨论】:

  • 您是否按照错误页面的提示查看了 apache 服务器错误日志?
  • @JohnGordon 我在哪里查看 apache 服务器错误日志?
  • 您可能只需更改 wsgi 文件顶部的 shebang 以指向您的 venv 的 python 二进制文件。类似#!/some/path/to/bin/python
  • 要找到correct python的路径,激活virtualenv并运行which python
  • 您也可以在此处尝试“创建 wsgi 文件”下列出的内容:thecodeship.com/deployment/…。主要是您想要的import sitesite.addsitedir(...)。我非常喜欢 uwsgi + nginx 的原因之一。

标签: python flask wsgi digital-ocean


【解决方案1】:

问题本质上是您在虚拟环境中安装 Flask 以及可能需要的其他库,但是 python(wsgi 接口)正在与没有安装这些额外库的系统 python 一起运行。

我最近在 Apache 上运行 Python 的经验很少(我来自 mod_python 和 cgi 的时代),但显然处理这个问题的一种方法是使用 site 包将 site-packages 从你的 venv 添加到执行的 Python。这将进入您的.wsgi 文件。

import site

site.addsitedir('/path/to/your/venv/lib/pythonX.X/site-packages')

【讨论】:

  • 尽量不要使用site.addsitedir()。使用 mod_wsgi 守护程序模式(这是推荐的方法),当您定义 WSGIDaemonProcess 时,使用 python-home 选项指定虚拟环境的位置。见blog.dscpl.com.au/2014/09/…
【解决方案2】:

我认为解决您的问题的最佳方法是添加告诉您的 wsgi 文件有关您的虚拟环境并激活它: 将以下代码放入您的 flaskapp.wsgi

activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

并重新启动 apache。 希望它会有所帮助! 查找更多here

【讨论】: