自定义 Flask 应用程序 运行 在本地主机上正常但向外部访问者返回 500 响应

Custom flask application running fine on localhost but returning 500 response to external visitors

最新更新: 确实是权限和​​用户组的问题,今天才知道为什么不直接用root。感谢 Jakub P. for reminding me to look into the apache error logs and thanks to domoarrigato 提供有用的见解和解决方案。


Whosebug 怎么了。

我遵循了 DigitalOcean 提供的 How To Deploy a Flask Application on an Ubuntu VPS 教程,并通过向我的 public 服务器IP.

还好吧?不是真的。

在那之后,我编辑了教程脚本并编写了一个自定义的 Flask 应用程序,我在我的个人开发环境中测试了该脚本并且它运行没有问题,我还在 DigitalOcean 服务器上测试了它,将它部署在本地主机上并且发出另一个 GET 请求。

一切正常,直到我尝试从我的 public DigitalOcean IP 访问它,现在突然出现 500 Internal Server Error.

是什么导致了这个问题,在这种情况下正确的调试方法是什么?

我尝试了什么?

我的代码

from flask import Flask, request, redirect
from netaddr import IPNetwork
import os
import time

app         = Flask(__name__)
APP_ROOT    = os.path.dirname(os.path.abspath(__file__))

# Custom directories
MODULES     = os.path.join(APP_ROOT, 'modules')
LOG         = os.path.join(APP_ROOT, 'log')


def check_blacklist(ip_adress):
    ipv4 = [item.strip() for item in open(MODULES + '//ipv4.txt').readlines()]
    ipv6 = [item.strip() for item in open(MODULES + '//ipv6.txt').readlines()]

    for item in ipv4 + ipv6:
        if ip_adress in IPNetwork(item):
            return True

        else:
            pass

    return False


@app.route('/')
def hello():
    ip_adress   = request.environ['REMOTE_ADDR']
    log_file    = open(LOG + '//captains_log.txt', 'a')

    with log_file as f:

        if check_blacklist(ip_adress):
            f.write('[ {}: {} ][ FaceBook ] - {} .\n'
                    .format(time.strftime("%d/%m/%Y"), time.strftime("%H:%M:%S"), request.environ))
            return 'Facebook'

        else:
            f.write('[ {}: {} ][ Normal User ] - {} .\n'
                    .format(time.strftime("%d/%m/%Y"), time.strftime("%H:%M:%S"), request.environ))
            return 'Normal Users'


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

教程代码:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello, I love Digital Ocean!"
if __name__ == "__main__":
    app.run()

似乎下一行可能是个问题:

log_file    = open(LOG + '//captains_log.txt', 'a')

如果它寻找的路径是:'/var/www/flaskapp/flaskapp/log//captains_log.txt'

在那里抛出异常是有道理的。可能文件在不同的地方,在服务器上,或者需要删除 / - 确保 open 命令会找到正确的文件。

如果captains_log.txt在flask app目录外,你可以复制进去chown。如果 txt 文件 需要 位于目录之外,那么您必须将用户添加到适当的组,或者打开实际目录的权限。

chown 命令应该是:

sudo chown www:www /var/www/flaskapp/flaskapp/log/captains_log.txt

运行 可能更聪明:

sudo chown -r www:www /var/www