最新更新:问题确实与权限和用户组有关,今天我了解了为什么我们不简单地使用 root 来处理所有事情。感谢Jakub P.提醒我查看 apache 错误日志,并感谢domoarrigato提供有用的见解和解决方案。
StackOverflow 怎么了。
我遵循了如何在 DigitalOcean 提供的 Ubuntu VPS 上部署 Flask 应用程序教程,并通过向我的公共服务器 IP 发出请求,让我的应用程序Hello, I love Digital Ocean!
在被外部访问时成功打印出来。GET
没事吧?并不真地。
之后,我编辑了教程脚本并编写了一个自定义的烧瓶应用程序,我在我的个人开发环境中测试了该脚本,它运行没有问题,我还在 DigitalOcean 服务器上对其进行了测试,方法是将其部署在本地主机上并发出另一个GET
请求。
在我尝试从我的公共 DigitalOcean IP 访问它之前,所有工作都按预期进行,现在我突然看到了一个500 Internal Server Error
.
是什么导致了这个问题,在这种情况下调试的正确方法是什么?
我尝试了什么?
设置在没有调试报告的情况下
app.debug = True
给出相同的结果。500 Internal Server Error
在我的台式电脑和 DigitalOcean 服务器的本地主机上运行应用程序没有错误,脚本按预期执行。
教程代码运行良好,
GET
向 Digital Ocean 公共 IP 发出请求会返回预期的响应。我可以在教程应用程序和我自己的应用程序之间切换,并且清楚地看到我只是在我的自定义应用程序中遇到错误。但是,自定义应用程序在 localhost 上运行仍然没有问题。
我的代码
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()