使用 Flask 框架开发了一个基本项目并部署到 Heroku 平台,但页面返回 500 内部服务器错误。没有使用数据库,在本地运行时项目可以正常运行。
日志显示:
[2015-01-10 23:40:03 +0000] [8] [INFO] Booting worker with pid: 8
[2015-01-10 23:40:03 +0000] [9] [INFO] Booting worker with pid: 9
[2015-01-10 23:40:04.268774+00:00] heroku[web.1]: State changed from starting to up
[2015-01-10 23:41:19.847544+00:00] heroku[router]: at=info method=GET path="/" host=topstreaks.herokuapp.com request_id=a2450ab9-3183-473f-aa0e-8e970b266b28 fwd="88.238.99.0" dyno=web.1 connect=1ms service=26ms status=500 bytes=456
[2015-01-10 23:41:20.206409+00:00] heroku[router]: at=info method=GET path="/favicon.ico" host=topstreaks.herokuapp.com request_id=1c969a6b-a8e7-4fcd-b84a-81b55cec18a6 fwd="88.238.99.0" dyno=web.1 connect=1ms service=2ms status=404 bytes=527
[2015-01-10 23:41:24.949004+00:00] heroku[router]: at=info method=GET path="/" host=topstreaks.herokuapp.com request_id=7f90b786-3ec9-49ab-b51a-a2cd942bc83d fwd="88.238.99.0" dyno=web.1 connect=1ms service=13ms status=500 bytes=456
[2015-01-10 23:44:05.320256+00:00] heroku[router]: at=info method=GET path="/" host=topstreaks.herokuapp.com request_id=8c0a51bd-459c-438e-8184-911557410c95 fwd="88.238.99.0" dyno=web.1 connect=3ms service=3ms status=500 bytes=456
[2015-01-10 23:44:05.697401+00:00] heroku[router]: at=info method=GET path="/favicon.ico" host=topstreaks.herokuapp.com request_id=59f43b94-fb30-414a-9a28-6ae7c195bd4b fwd="88.238.99.0" dyno=web.1 connect=0ms service=2ms status=404 bytes=527
[2015-01-10 23:48:29.595955+00:00] heroku[router]: at=info method=GET path="/" host=topstreaks.herokuapp.com request_id=13941ed3-2496-4d0e-aacc-5fb6a7a122e9 fwd="88.238.99.0" dyno=web.1 connect=3ms service=2ms status=500 bytes=456
[2015-01-10 23:48:47.739233+00:00] heroku[router]: at=info method=GET path="/" host=topstreaks.herokuapp.com request_id=6c370ced-99fe-429a-829b-0ea55b4aa508 fwd="88.238.99.0" dyno=web.1 connect=0ms service=2ms status=500 bytes=456
[2015-01-10 23:52:15.563473+00:00] heroku[router]: at=info method=GET path="/" host=topstreaks.herokuapp.com request_id=a0ceaf25-359e-4bc1-9247-5d6f478d1dd2 fwd="88.238.99.0" dyno=web.1 connect=0ms service=1ms status=500 bytes=456
[2015-01-10 23:52:20.050874+00:00] heroku[router]: at=info method=GET path="/" host=topstreaks.herokuapp.com request_id=1086dffb-e144-4873-b49b-5e4ac44477f3 fwd="88.238.99.0" dyno=web.1 connect=0ms service=2ms sta
tus=500 bytes=456
2、解决方案
1. 在应用中设置日志记录器并将其打印到标准输出
import logging
app.logger.addHandler(logging.StreamHandler())
app.logger.setLevel(logging.ERROR)
这样,当在 Heroku 上运行时,任何错误都会被打印到 Heroku 日志中。
2. 检查模板文件的位置
确保模板文件(html)位于项目根目录下的 templates 文件夹中,而不是任意位置。如果模板文件不在正确的路径下,可能会导致 500 错误。
3. 使用 after_request 装饰器添加 CORS 标头
在 Flask 应用中使用 after_request 装饰器添加 CORS 标头,允许跨域请求。
@app.after_request
def after_request(response):
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE')
return response
4. 启用 Flask 调试模式
在 Flask 应用中启用调试模式,以便在本地开发和测试时能够看到详细的错误信息。
app.debug = True
5. 运行 Flask 应用
使用 app.run() 方法运行 Flask 应用。
if __name__ == "__main__":
app.run()
代码
from flask import Flask, render_template
import logging
app = Flask(__name__)
app.logger.addHandler(logging.StreamHandler())
app.logger.setLevel(logging.ERROR)
@app.route('/')
def home():
return render_template('topstreaks.html')
@app.route('/script')
def script():
return render_template('datum.js')
@app.after_request
def after_request(response):
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE')
return response
if __name__ == "__main__":
app.debug = True
app.run()