为Flask中的所有请求设置HTTP头

2024-05-01 21:37:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Flask,并且有需要授权的端点(有时还有其他特定于应用程序的头)。在我的测试中,使用test_client函数创建客户机,然后执行各种get、put、delete调用。所有这些调用都需要授权,并且需要添加其他头。如何设置测试客户机,以便在所有请求上放置这样的头?


Tags: 函数testclient应用程序flaskget客户机put
3条回答

根据@soulsekah的建议,扩展测试客户端并将应用指向它并不太困难。我最近这样做是为了在测试头中有一个默认的api密钥。给出的示例使用py.test夹具,但很容易适应unittest/nosetest。

from flask import testing
from werkzeug.datastructures import Headers


class TestClient(testing.FlaskClient):
    def open(self, *args, **kwargs):
        api_key_headers = Headers({
            'x-api-key': 'TEST-API-KEY'
        })
        headers = kwargs.pop('headers', Headers())
        headers.extend(api_key_headers)
        kwargs['headers'] = headers
        return super().open(*args, **kwargs)


@pytest.fixture(scope='session')
def test_client(app):
    app.test_client_class = TestClient
    return app.test_client()

您可以包装WSGI应用程序并在其中插入标题:

from flask import Flask, request
import unittest

def create_app():
    app = Flask(__name__)

    @app.route('/')
    def index():
        return request.headers.get('Custom', '')

    return app

class TestAppWrapper(object):

    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        environ['HTTP_CUSTOM'] = 'Foo'
        return self.app(environ, start_response)


class Test(unittest.TestCase):

    def setUp(self):
        self.app = create_app()
        self.app.wsgi_app = TestAppWrapper(self.app.wsgi_app)
        self.client = self.app.test_client()

    def test_header(self):
        resp = self.client.get('/')
        self.assertEqual('Foo', resp.data)


if __name__ == '__main__':
    unittest.main()

^{}类采用与^{}类相同的参数,其中有^{}关键字参数。

所以您可以简单地使用client.get( '/', headers={ ... } )发送您的身份验证。

现在,如果您想从客户端提供一组默认的头,您需要提供自己的^{}实现,它提供一个修改过的环境生成器(类似于^{}),并设置^{}来指向您的新类。

相关问题 更多 >