Flask 错误处理
我正在尝试捕捉一个由flask-sqlalchemy产生的错误。我的代码不幸的是无法处理这个错误,因为调试器先捕捉到了它。这个错误发生在我试图往数据库中插入一条记录,而这条记录的某个字段应该是唯一的,但却出现了重复的情况。有没有什么办法可以解决这个问题?这是错误追踪信息。
sqlalchemy.exc.IntegrityError
IntegrityError: (IntegrityError) column username is not unique u'INSERT INTO user (username, password, karma) VALUES (?, ?, ?)' (u'Test', u'test', 0)
Traceback (most recent call last)
*
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 889, in __call__
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] return self.wsgi_app(environ, start_response)
*
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 879, in wsgi_app
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] response = self.make_response(self.handle_exception(e))
*
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 876, in wsgi_app
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] rv = self.dispatch_request()
*
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 695, in dispatch_request
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] return self.view_functions[rule.endpoint](**req.view_args)
*
File "/home/josh/Projects/masterpieces_of_code/app.py", line 70, in create_user
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] db.session.commit()
*
File "/usr/share/pyshared/sqlalchemy/orm/scoping.py", line 129, in do
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] return getattr(self.registry(), name)(*args, **kwargs)
*
File "/usr/share/pyshared/sqlalchemy/orm/session.py", line 653, in commit
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] self.transaction.commit()
*
File "/usr/share/pyshared/sqlalchemy/orm/session.py", line 364, in commit
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] self._prepare_impl()
*
File "/usr/share/pyshared/sqlalchemy/orm/session.py", line 348, in _prepare_impl
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] self.session.flush()
*
File "/usr/share/pyshared/sqlalchemy/orm/session.py", line 1346, in flush
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] self._flush(objects)
*
File "/usr/share/pyshared/sqlalchemy/orm/session.py", line 1427, in _flush
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] flush_context.execute()
*
File "/usr/share/pyshared/sqlalchemy/orm/unitofwork.py", line 299, in execute
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] rec.execute(self)
*
File "/usr/share/pyshared/sqlalchemy/orm/unitofwork.py", line 443, in execute
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] uow
*
File "/usr/share/pyshared/sqlalchemy/orm/mapper.py", line 1833, in _save_obj
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] execute(statement, params)
*
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1794, in execute
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] object, *multiparams, **params)
*
File "/usr/share/pyshared/sqlalchemy/interfaces.py", line 149, in execute
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] return execute(clauseelement, *multiparams, **params)
*
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1157, in execute
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] params)
*
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1237, in _execute_clauseelement
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] return self.__execute_context(context)
*
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1268, in __execute_context
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] context.parameters[0], context=context)
*
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1806, in _cursor_execute
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] cursor, statement, parameters, context, False)
*
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flaskext/sqlalchemy.py", line 115, in cursor_execute
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] return execute(cursor, statement, parameters, context)
*
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1367, in _cursor_execute
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] context)
*
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1360, in _cursor_execute
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] context)
*
File "/usr/share/pyshared/sqlalchemy/engine/default.py", line 288, in do_execute
[Display the sourcecode for this frame] [Open an interactive python shell in this frame] cursor.execute(statement, parameters)
IntegrityError: (IntegrityError) column username is not unique u'INSERT INTO user (username, password, karma) VALUES (?, ?, ?)' (u'Test', u'test', 0)
This is the Copy/Paste friendly version of the traceback. You can also paste this traceback into the public lodgeit pastebin:
Traceback (most recent call last):
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 889, in __call__
return self.wsgi_app(environ, start_response)
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 879, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 876, in wsgi_app
rv = self.dispatch_request()
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 695, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/josh/Projects/masterpieces_of_code/app.py", line 70, in create_user
db.session.commit()
File "/usr/share/pyshared/sqlalchemy/orm/scoping.py", line 129, in do
return getattr(self.registry(), name)(*args, **kwargs)
File "/usr/share/pyshared/sqlalchemy/orm/session.py", line 653, in commit
self.transaction.commit()
File "/usr/share/pyshared/sqlalchemy/orm/session.py", line 364, in commit
self._prepare_impl()
File "/usr/share/pyshared/sqlalchemy/orm/session.py", line 348, in _prepare_impl
self.session.flush()
File "/usr/share/pyshared/sqlalchemy/orm/session.py", line 1346, in flush
self._flush(objects)
File "/usr/share/pyshared/sqlalchemy/orm/session.py", line 1427, in _flush
flush_context.execute()
File "/usr/share/pyshared/sqlalchemy/orm/unitofwork.py", line 299, in execute
rec.execute(self)
File "/usr/share/pyshared/sqlalchemy/orm/unitofwork.py", line 443, in execute
uow
File "/usr/share/pyshared/sqlalchemy/orm/mapper.py", line 1833, in _save_obj
execute(statement, params)
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1794, in execute
object, *multiparams, **params)
File "/usr/share/pyshared/sqlalchemy/interfaces.py", line 149, in execute
return execute(clauseelement, *multiparams, **params)
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1157, in execute
params)
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1237, in _execute_clauseelement
return self.__execute_context(context)
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1268, in __execute_context
context.parameters[0], context=context)
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1806, in _cursor_execute
cursor, statement, parameters, context, False)
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flaskext/sqlalchemy.py", line 115, in cursor_execute
return execute(cursor, statement, parameters, context)
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1367, in _cursor_execute
context)
File "/usr/share/pyshared/sqlalchemy/engine/base.py", line 1360, in _cursor_execute
context)
File "/usr/share/pyshared/sqlalchemy/engine/default.py", line 288, in do_execute
cursor.execute(statement, parameters)
IntegrityError: (IntegrityError) column username is not unique u'INSERT INTO user (username, password, karma) VALUES (?, ?, ?)' (u'Test', u'test', 0)
The debugger caught an exception in your WSGI application. You can now look at the traceback which led to the error.
To switch between the interactive traceback and the plaintext one, you can click on the "Traceback" headline. From the text traceback you can also create a paste of it. For code execution mouse-over the frame you want to debug and click on the console icon on the right side.
You can execute arbitrary Python code in the stack frames and there are some extra helpers available for introspection:
* dump() shows all variables in the frame
* dump(obj) dumps all that's known about the object
Brought to you by DON'T PANIC, your friendly Werkzeug powered traceback interpreter.
我忘了提到当我尝试处理这个错误时,flask是如何反应的。我遇到了与未定义的全局变量有关的问题。这是那个错误的追踪信息。
Traceback (most recent call last):
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 889, in __call__
return self.wsgi_app(environ, start_response)
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 879, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 876, in wsgi_app
rv = self.dispatch_request()
File "/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py", line 695, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/josh/Projects/masterpieces_of_code/app.py", line 72, in create_user
except(IntegrityError):
NameError: global name 'IntegrityError' is not defined
1 个回答
10
你需要在你的 create_user
函数(masterpieces_of_code/app.py)里加一个 try/catch 语句,特别是在执行 db.session.commit()
的那部分代码中,这样可以处理可能出现的错误。
更新:如果你看到 NameError
提示说 IntegrityError
,那就说明你可能缺少了一个
from sqlalchemy.exc import IntegrityError
在你的 app.py
文件里。这不是 Flask 给你的提示,而是 Python 在运行 app.py
代码时告诉你有一个未知的名字(因为缺少了导入)。