mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-07 13:54:47 +03:00
Add cookie support
This commit is contained in:
parent
6ede654315
commit
049a39e060
|
@ -26,7 +26,7 @@ def force_authenticate(request, user=None, token=None):
|
||||||
|
|
||||||
|
|
||||||
if requests is not None:
|
if requests is not None:
|
||||||
class DjangoTestAdapter(requests.adapters.BaseAdapter):
|
class DjangoTestAdapter(requests.adapters.HTTPAdapter):
|
||||||
"""
|
"""
|
||||||
A transport adapter for `requests`, that makes requests via the
|
A transport adapter for `requests`, that makes requests via the
|
||||||
Django WSGI app, rather than making actual HTTP requests over the network.
|
Django WSGI app, rather than making actual HTTP requests over the network.
|
||||||
|
@ -62,23 +62,38 @@ if requests is not None:
|
||||||
"""
|
"""
|
||||||
Make an outgoing request to the Django WSGI application.
|
Make an outgoing request to the Django WSGI application.
|
||||||
"""
|
"""
|
||||||
response = requests.models.Response()
|
raw_kwargs = {}
|
||||||
|
|
||||||
def start_response(status, headers):
|
def start_response(wsgi_status, wsgi_headers):
|
||||||
status_code, _, reason_phrase = status.partition(' ')
|
class MockOriginalResponse(object):
|
||||||
response.status_code = int(status_code)
|
def __init__(self, headers):
|
||||||
response.reason = reason_phrase
|
self.msg = requests.packages.urllib3._collections.HTTPHeaderDict(headers)
|
||||||
response.headers = requests.structures.CaseInsensitiveDict(headers)
|
self.closed = False
|
||||||
response.encoding = requests.utils.get_encoding_from_headers(response.headers)
|
|
||||||
|
|
||||||
|
def isclosed(self):
|
||||||
|
return self.closed
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
self.closed = True
|
||||||
|
|
||||||
|
status, _, reason = wsgi_status.partition(' ')
|
||||||
|
raw_kwargs['status'] = int(status)
|
||||||
|
raw_kwargs['reason'] = reason
|
||||||
|
raw_kwargs['headers'] = wsgi_headers
|
||||||
|
raw_kwargs['version'] = 11
|
||||||
|
raw_kwargs['preload_content'] = False
|
||||||
|
raw_kwargs['original_response'] = MockOriginalResponse(wsgi_headers)
|
||||||
|
|
||||||
|
# Make the outgoing request via WSGI.
|
||||||
environ = self.get_environ(request)
|
environ = self.get_environ(request)
|
||||||
raw_bytes = self.app(environ, start_response)
|
wsgi_response = self.app(environ, start_response)
|
||||||
|
|
||||||
response.request = request
|
# Build the underlying urllib3.HTTPResponse
|
||||||
response.url = request.url
|
raw_kwargs['body'] = io.BytesIO(b''.join(wsgi_response))
|
||||||
response.raw = io.BytesIO(b''.join(raw_bytes))
|
raw = requests.packages.urllib3.HTTPResponse(**raw_kwargs)
|
||||||
|
|
||||||
return response
|
# Build the requests.Response
|
||||||
|
return self.build_response(request, raw)
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -37,7 +37,7 @@ class Root(APIView):
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
class Headers(APIView):
|
class HeadersView(APIView):
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
headers = {
|
headers = {
|
||||||
key[5:].replace('_', '-'): value
|
key[5:].replace('_', '-'): value
|
||||||
|
@ -50,9 +50,32 @@ class Headers(APIView):
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
class SessionView(APIView):
|
||||||
|
def get(self, request):
|
||||||
|
return Response({
|
||||||
|
key: value for key, value in request.session.items()
|
||||||
|
})
|
||||||
|
|
||||||
|
def post(self, request):
|
||||||
|
for key, value in request.data.items():
|
||||||
|
request.session[key] = value
|
||||||
|
return Response({
|
||||||
|
key: value for key, value in request.session.items()
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
class CookiesView(APIView):
|
||||||
|
def get(self, request):
|
||||||
|
return Response({
|
||||||
|
key: value for key, value in request.COOKIES.items()
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^$', Root.as_view()),
|
url(r'^$', Root.as_view()),
|
||||||
url(r'^headers/$', Headers.as_view()),
|
url(r'^headers/$', HeadersView.as_view()),
|
||||||
|
url(r'^session/$', SessionView.as_view()),
|
||||||
|
url(r'^cookies/$', CookiesView.as_view()),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -138,4 +161,53 @@ class RequestsClientTests(APITestCase):
|
||||||
}
|
}
|
||||||
assert response.json() == expected
|
assert response.json() == expected
|
||||||
|
|
||||||
|
def test_session(self):
|
||||||
|
response = self.requests.get('/session/')
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.headers['Content-Type'] == 'application/json'
|
||||||
|
expected = {}
|
||||||
|
assert response.json() == expected
|
||||||
|
|
||||||
|
response = self.requests.post('/session/', json={'example': 'abc'})
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.headers['Content-Type'] == 'application/json'
|
||||||
|
expected = {'example': 'abc'}
|
||||||
|
assert response.json() == expected
|
||||||
|
|
||||||
|
response = self.requests.get('/session/')
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.headers['Content-Type'] == 'application/json'
|
||||||
|
expected = {'example': 'abc'}
|
||||||
|
assert response.json() == expected
|
||||||
|
|
||||||
|
def test_cookies(self):
|
||||||
|
"""
|
||||||
|
Test for explicitly setting a cookie.
|
||||||
|
"""
|
||||||
|
my_cookie = {
|
||||||
|
"version": 0,
|
||||||
|
"name": 'COOKIE_NAME',
|
||||||
|
"value": 'COOKIE_VALUE',
|
||||||
|
"port": None,
|
||||||
|
# "port_specified":False,
|
||||||
|
"domain": 'testserver.local',
|
||||||
|
# "domain_specified":False,
|
||||||
|
# "domain_initial_dot":False,
|
||||||
|
"path": '/',
|
||||||
|
# "path_specified":True,
|
||||||
|
"secure": False,
|
||||||
|
"expires": None,
|
||||||
|
"discard": True,
|
||||||
|
"comment": None,
|
||||||
|
"comment_url": None,
|
||||||
|
"rest": {},
|
||||||
|
"rfc2109": False
|
||||||
|
}
|
||||||
|
self.requests.cookies.set(**my_cookie)
|
||||||
|
response = self.requests.get('/cookies/')
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.headers['Content-Type'] == 'application/json'
|
||||||
|
expected = {'COOKIE_NAME': 'COOKIE_VALUE'}
|
||||||
|
assert response.json() == expected
|
||||||
|
|
||||||
# cookies/session auth
|
# cookies/session auth
|
||||||
|
|
Loading…
Reference in New Issue
Block a user