gpt4 book ai didi

python - 无法使用 DRF APIClient() 更改 header

转载 作者:行者123 更新时间:2023-12-05 03:44:26 25 4
gpt4 key购买 nike

我使用 APIClient() 进行测试。我使用 Token 认证,所以我需要使用 THIS

如果我们深入研究源代码,我们将看到接下来的内容:

# rest_framework/test.py
class APIClient(APIRequestFactory, DjangoClient):
def __init__(self, enforce_csrf_checks=False, **defaults):
super().__init__(**defaults)
self.handler = ForceAuthClientHandler(enforce_csrf_checks)
self._credentials = {}

def credentials(self, **kwargs):
"""
Sets headers that will be used on every outgoing request.
"""
self._credentials = kwarg

我还在我的代码中使用 APIClient() 作为 pytest fixture:

@pytest.fixture(scope="function")
def _api():
"""API factory for anonymous and auth requests"""

def __api(token=None, field=None):
api_client = APIClient()
headers = {}

if token:
headers["HTTP_AUTHORIZATION"] = f"Token {token}"
if field:
headers["X-CUSTOM-HEADER"] = field

api_client.credentials(**headers)

return api_client
return __api

但是如果我们创建 TestMiddleware 来查找 header ,我们将看到下一个:

lass TestMiddleware:
def __init__(self, get_response):
self._get_response = get_response

def __call__(self, request):
header = request.headers.get("X-CUSTOM-HEADER") # None
header = request.META.get("X-CUSTOM-HEADER") # Works fine!
...

# Response processing
response = self._get_response(request)

return response

问题是我们有没有办法通过APIClient()访问X-CUSTOM-HEADER?另外,如果我使用 Postman,它显然可以与 request.headers.get()

一起使用

最佳答案

kwargs 传递给了 credentials() method最终直接送入 constructor for a WSGIRequest ;这意味着它接受的 kwargs 不是 HTTP header ,而是 WSGI 环境变量。作为 WSGI 环境变量传递的 HTTP header 总是以 HTTP_ 为前缀——例如Authorization header 配置有 HTTP_AUTHORIZATION。此外,下划线用于代替破折号。

要让您的 X-Custom-Header header 出现在 request.headers 的另一侧(不是 request.META,它是WSGI 环境变量的副本),传递 HTTP_X_CUSTOM_HEADER 而不是 X-CUSTOM-HEADER

关于python - 无法使用 DRF APIClient() 更改 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66437820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com