我的环境:
Python3.7
烧瓶== 1.0.2
pytest == 4.3.1
我正在寻找一种在pytest函数中同时检索请求对象和响应对象的方法。然后我遇到了这个单元测试片段。
http://flask.pocoo.org/snippets/58/
下面是我的工作。
def test_busking(session, monkeypatch, report=Report()):
with app.test_request_context('/busking/zones'):
# call the before funcs
rv = app.preprocess_request()
if rv != None:
response = app.make_response(rv)
else:
# do the main dispatch
rv = app.dispatch_request()
response = app.make_response(rv)
# now do the after funcs
response = app.process_response(response)
assert flask.request
assert response
在我的环境中效果很好。我能够同时获得两个对象。我的问题是什么...
rv is None
时调用dispatch_request()。为什么当rv还有别的东西时?
process_response()也为什么在rv is None
时被调用?
它接缝像preprocess_request()调用before_request_funcs
,并且rv是最后一个before_request_function
的返回值...看起来rv与派遣请求无关,但是我知道一定是...告诉我我的错。
在preprocess_request(),make_response(),dispatch_request(),process_response()中,还有很多我不了解的东西。我认为rv和process_request()发挥了重要作用,但我不确定。如果您还说明背景情况,那将不胜感激。
答案 0 :(得分:0)
我不是Flask的专家,所以这个答案可能会遗漏一些要点,但我认为足以澄清您的情况:
before_request
函数返回的值不是None
,它将被视为视图的响应,因此不再进行任何处理,请参见preprocess_request's doc process_response
调用after_request
方法,无论响应内容(AFAIK)如何都被调用rv
是从None
收到的第一个非before_request
结果,而不是最后一个, None
返回,处理停止。乍一看,我会说这是事物的顺序:
preprocess_request
:依次调用before_request
函数None
不同,请立即停止调用其余的并跳至(4)dispatch_request
:调用与路由规则关联的方法make_response
:根据先前的结果(此处为Response
)准备rv
对象process_response
:使用after_request
对象调用Response
函数