自定义 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
.
是什么导致了这个问题,在这种情况下正确的调试方法是什么?
我尝试了什么?
设置 app.debug = True
给出相同的 500 Internal Server Error
而没有调试报告。
运行 我的台式电脑和 DigitalOcean 服务器的本地主机上的应用程序没有错误,脚本按预期执行。
教程代码运行良好,并向 Digital Ocean public IP returns 发出 GET
请求,得到预期的响应。
我可以在教程应用程序和我自己的应用程序之间切换,并且清楚地看到我 仅 在我的自定义应用程序中遇到错误。但是,自定义应用程序在本地主机上仍然存在 no 问题 运行。
我的代码
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
最新更新: 确实是权限和用户组的问题,今天才知道为什么不直接用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
.
是什么导致了这个问题,在这种情况下正确的调试方法是什么?
我尝试了什么?
设置
app.debug = True
给出相同的500 Internal Server Error
而没有调试报告。运行 我的台式电脑和 DigitalOcean 服务器的本地主机上的应用程序没有错误,脚本按预期执行。
教程代码运行良好,并向 Digital Ocean public IP returns 发出
GET
请求,得到预期的响应。我可以在教程应用程序和我自己的应用程序之间切换,并且清楚地看到我 仅 在我的自定义应用程序中遇到错误。但是,自定义应用程序在本地主机上仍然存在 no 问题 运行。
我的代码
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