启动 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()
您已将 username
和 email
字段设置为唯一。第一次访问 /
时,会创建两个用户。第二次访问时,视图会尝试再次创建和插入相同的两个用户。但是,用户名和电子邮件已经存在于数据库中,因此失败。
创建具有相同值的模型实例不同于从数据库中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 文件移动到模板文件夹下时,问题得到解决。
我正在学习教程: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()
您已将 username
和 email
字段设置为唯一。第一次访问 /
时,会创建两个用户。第二次访问时,视图会尝试再次创建和插入相同的两个用户。但是,用户名和电子邮件已经存在于数据库中,因此失败。
创建具有相同值的模型实例不同于从数据库中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 文件移动到模板文件夹下时,问题得到解决。