首页 > 解决方案 > Flask:在请求上下文中插入新属性以进行测试

问题描述

我有一个向请求对象添加属性的中间件。

# middleware.py
from flask import request

...

def middleware():
    # some logic..
    result = api_call(processed_auth_token)    
    setattr(request, "result", result)

我将此属性用作路由器逻辑的一部分

# routes.py
@app.route('/my_route')
@middleware
def simple_route():
    ...
    # use request.result here...

在测试期间,我不想经历生成令牌和调用 api_call 的麻烦(也是出于实际原因,因为我的部署管道无法访问互联网)。我希望能够在测试期间将不同的值附加到我的结果属性。所以给定一个如下的测试场景

# test_simple_route.py
...
def test_simple_route(client):
    # client is in the context of test_client
    response = client.get('/my_route')
    ...

如何在上面的获取请求中的请求对象(来自烧瓶)中设置“结果”属性?我试过使用test_request_context,但请求最终在与客户端不同的上下文中。有任何想法吗?

标签: pythonflaskrequestpytestmiddleware

解决方案


通过测试客户端发出请求会设置一个新的请求上下文。

您可以在设置请求上下文后直接调用视图函数来测试中间件,如下所示:

import flask

def test_simple_route(app):
    with app.test_request_context():
        setattr(flask.request, "result", "test-value")
        response = simple_route() 

我强烈建议将此session对象用于此用例。它们允许存储从请求到每个用户请求的信息。


推荐阅读