我注意到app.handle_exception
发生异常时似乎没有调用app.test_request_context
:
from flask import *
app = Flask(__name__)
app.handle_exception = lambda e: 'exception!'
@app.route('/foo')
def foo():
x = 1 / 0
return 'ok'
if __name__ == '__main__':
#app.run(port=81) # handle_exception works here
with app.test_request_context('/foo'):
print app.dispatch_request() # but not here
这是预期的行为吗?
答案 0 :(得分:1)
您可以轻松覆盖此行为并使用相同的处理程序强制处理异常。
def run_test(path=None,check_func=None,*args,**kwargs):
with app.test_request_context(path,*args,**kwargs):
try:
data=app.dispatch_request()
if check_func is not None:
check_func()
else:
print data
except Exception as e:
print app.handle_exception(e)
run_test('/')
run_test('/other')
def current_test(data):
assert 'has some content' in data
run_test('/should_be_checked',check_func=current_test)
另一个词。
您的方法不起作用,因为您只是不使用Flask的那部分,它实际上捕获了Exception。您正在直接调用上下文。
来自文档:
如果你看看Flask WSGI应用程序内部是如何工作的,你会发现一段看起来非常像这样的代码:
def wsgi_app(self, environ):
with self.request_context(environ):
try:
response = self.full_dispatch_request()
except Exception, e:
response = self.make_response(self.handle_exception(e))
return response(environ, start_response)
但是! 以下是正确的方法,因为每个级别的所有Flask方法都将以适当的方式调用:
with app.test_request_context():
with app.test_client() as client:
resp = client.get('/')
#and if you need content of response: print resp.data
答案 1 :(得分:1)
请求是否已分派。匹配URL并返回返回值 视图或错误处理程序的值。这不一定是一个 响应对象。为了将返回值转换为正确的值 响应对象,调用make_response()。
在0.7版中更改:这不再进行异常处理, 此代码已移至新的full_dispatch_request()。
所以,也许替换......
with app.test_request_context('/foo'):
print app.dispatch_request() # but not here
...与...
with app.test_request_context('/foo'):
print app.full_dispatch_request() # Hopefully this works now :)