我有一个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中显示某些内容,请将其设为kwarg
。该client.get
方法与的签名不同requests.get
。
这是因为self.client.get
映射的kwarg直接映射到HTTP属性。
快来看看源。您会注意到堆栈是:
get
generic
request
_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
然后将以上内容传递给WSGIRequest
该request
方法中的对象。然后,该类采用提供的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] 删除。
我来说两句