Django rest框架:客户端中的自定义标头与单元测试中的标头不同

诺克

我有一个Django Rest API,然后有一个使用此API的客户端。

我使用客户端中的请求传递自定义标头:

r = requests.get(url, params=params, headers={'license': '12345'})

然后在API中,在我的自定义权限下,我得到的标头如下:

app_license = request.META['HTTP_LICENSE']

我知道django出于安全原因重写了自定义标头,因此它可以正常工作。

我的问题是当我在Django rest API中编写单元测试时:

response = self.client.get(self.url, params=params, headers={'license': '12345'})

然后它提出:

KeyError: 'HTTP_LICENSE'

但是,如果我这样更改代码,则测试可以顺利通过,但是使用者无法使用:

request.META['headers']['license']

我可以检查是否有“ headers”键,但我不想仅通过单元测试就更改代码,这一定是某种写符合实际情况的单元测试的方法,对吗?

我尝试使用:

from django.test import TestCase

和:

from rest_framework.test import APITestCase

两者具有相同的结果。有什么解决办法吗?谢谢!

瓦伦普尔

TL; DR-如果要在META中显示某些内容,请将其设为kwargclient.get方法与的签名不同requests.get


这是因为self.client.get映射的kwarg直接映射到HTTP属性。

快来看看源您会注意到堆栈是:

  1. get
  2. generic
  3. request
  4. _base_environ

在这个过程中,kwargs被运送到_base_environ用很少的改动。然后将它们合并到包含您期望的所有基本标头的字典中:

    # This is a minimal valid WSGI environ dictionary, plus:
    # - HTTP_COOKIE: for cookie support,
    # - REMOTE_ADDR: often useful, see #8551.
    # See http://www.python.org/dev/peps/pep-3333/#environ-variables
    environ = {
        'HTTP_COOKIE': self.cookies.output(header='', sep='; '),
        'PATH_INFO': '/',
        'REMOTE_ADDR': '127.0.0.1',
        'REQUEST_METHOD': 'GET',
        'SCRIPT_NAME': '',
        'SERVER_NAME': 'testserver',
        'SERVER_PORT': '80',
        'SERVER_PROTOCOL': 'HTTP/1.1',
        'wsgi.version': (1, 0),
        'wsgi.url_scheme': 'http',
        'wsgi.input': FakePayload(b''),
        'wsgi.errors': self.errors,
        'wsgi.multiprocess': True,
        'wsgi.multithread': False,
        'wsgi.run_once': False,
    }
    environ.update(self.defaults)
    environ.update(request)
    return environ

然后将以上内容传递给WSGIRequestrequest方法中对象然后,该类采用提供的environ字典并将其分配给META属性:

class WSGIRequest(HttpRequest):
    def __init__(self, environ):
        script_name = get_script_name(environ)
        # If PATH_INFO is empty (e.g. accessing the SCRIPT_NAME URL without a
        # trailing slash), operate as if '/' was requested.
        path_info = get_path_info(environ) or '/'

        ##############################
        ##                          ##
        ## This is the line you're  ##
        ##       looking for.       ##
        ##                          ##
        ##############################
        self.environ = environ
        self.path_info = path_info

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Django Rest Framework API客户端自定义标头

对Django的请求中缺少自定义标头

请求对象中的Django REST Framework自定义标头

使用Django Rest框架在发布请求时获取自定义标头

自定义标头未添加到Django Rest Framework中的request.META中

Django测试客户端方法覆盖标头

Django 在速记渲染方法中添加自定义标头

根据要求在Django中间件中添加自定义标头

在Django rest框架中处理请求标头,以获取在标头中传递的密钥?

Django不会解析自定义的HTTP Accept标头

Django:自定义http标头身份验证

标头和边界包含在上载的文件Django Rest框架中

Django自定义中间件检查标头令牌。使用有效请求标头令牌的测试仍然失败

在Django测试中设置标头(API版本控制)

在Django Rest Framework中包含位置标头

Android如何在grpc客户端中添加自定义标头?

Django中的HTTP_AUTHORIZATION标头

从 Spring Rest 到 AngularJS 客户端的自定义标头

在Django rest框架中处理请求标头,以获取传递到标头中的密钥,并将其与User表一起保存?

Django Rest Framework缓存标头

在Django mod_wsgi脚本中访问请求标头

如何在Django中删除Xframe Options标头?

在Django中添加电子邮件标头

Django CORS标头无法按文件中的建议工作

Django Rest Framework-如何在urls.py中获取Http标头信息

如何通过Django Rest API本机中的标头传递JWT令牌?

在不使用客户端的情况下在Django中设置授权标头

Django Rest框架中的自定义节流响应

在Django Rest框架中自定义Json Response