启动 flask 后出现内部服务器错误 500 python

Internal server error 500 after launching flask python

我正在学习教程:https://pythonhosted.org/Flask-SQLAlchemy/quickstart.html 但我缺少一些东西。我正在使用 Pycharm 4.0.6 作为解释器。几乎一切正常,但是当我添加 db.session.commit() 它说我:内部服务器错误 500

服务器遇到内部错误,无法完成您的请求。要么是服务器过载,要么是应用程序出错。

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email
    def __repr__(self):
        return '<User %r>' % self.username

@app.route('/')
def hello_world():
    db.create_all()
    admin = User('admin', 'admin@example.com')
    guest = User('guest', 'guest@example.com')
    db.session.add(admin)
    db.session.add(guest)
    db.session.commit()
    return 'Hello World'



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

您已将 usernameemail 字段设置为唯一。第一次访问 / 时,会创建两个用户。第二次访问时,视图会尝试再次创建和插入相同的两个用户。但是,用户名和电子邮件已经存在于数据库中,因此失败。

创建具有相同值的模型实例不同于从数据库中select获取它。相反,您应该首先尝试 select 现有实例,并且仅在查询没有 return 任何内容时才创建新实例。

admin = User.query.filter(
    User.username == 'admin' | User.email == 'admin@example.com'
).first()

if admin is None:
    admin = User('admin', 'admin@example.com')
    db.session.add(admin)
    db.session.commit()

要更深入地了解,请参阅 SQLAlchemy wiki 中的 Unique recipe

最好设置 "app.debug = True" 以获取可以帮助您解决问题的错误消息,我相信@davidism 已经抢先找到了答案,但补充一下,您应该按如下方式捕获 SQlAlchemy 错误:

from sqlalchemy.exc import SQLAlchemyError

try:
    db.session.commit()
except SQLAlchemyError as e:
     reason=str(e)
     flash(reason)

这样您的应用程序将继续 运行 并且错误消息将闪烁在屏幕上,使您和最终用户更容易更正错误。

就我而言,我使用的是模板文件夹外的 index.html 模板。 当我将 index.html 文件移动到模板文件夹下时,问题得到解决。