Python Django:在测试客户端上设置cookie?
我的Django站点是用一些中间件建立的,这些中间件在每次请求时检查cookie,如果没有设置cookie,则将用户转发到其他地方 我现在想在网站上运行一些测试。这是我的代码:Python Django:在测试客户端上设置cookie?,python,django,Python,Django,我的Django站点是用一些中间件建立的,这些中间件在每次请求时检查cookie,如果没有设置cookie,则将用户转发到其他地方 我现在想在网站上运行一些测试。这是我的代码: def test_contactform(self): response = self.client.get('/contact/') self.assertEqual(response.status_code, 200) print response self.assertTrue('C
def test_contactform(self):
response = self.client.get('/contact/')
self.assertEqual(response.status_code, 200)
print response
self.assertTrue('Contact me' in response.content)
不幸的是,这在以下方面失败:
Vary: Cookie
Content-Type: text/html; charset=utf-8
Location: http://testserver/ldap/?next=/contact/
Traceback (most recent call last):
File "tests.py", line 43, in test_contactform
self.assertEqual(response.status_code, 200)
AssertionError: 302 != 200
我是否可以(I)在Django测试客户端上设置cookie(如果是的话,如何设置cookie)或(ii)要求Django测试客户端遵循重定向并针对最后一页进行测试?客户端
get
方法采用follow
参数,该参数允许它遵循重定向:
response = self.client.get('/contact/', follow=True)
虽然公认的答案是解决此问题的正确方法,但我只想指出,您可以直接设置cookie(即您所称的方法编号(I)),但不能通过测试客户端。相反,您需要使用来构造一个可以设置cookie的请求,然后将其直接传递给相关视图 因此,不是:
response = self.client.get('/contact/')
你可以:
request = RequestFactory().get('/contact/')
request.COOKIES['thing'] = 'whatever'
response = contact_view(request)
其中
contact\u view
是服务于/contact/
的视图。这是一个老问题,但可能对某些人来说很方便:
from http.cookies import SimpleCookie
from django.test import TestCase, Client
class CookieClientTests(TestCase):
def test_cookie(self):
cookies = SimpleCookie()
cookies["cookie_key"] = "something"
client = Client(HTTP_COOKIE=cookies.output(header='', sep='; '))
resp = client.get("/")
self.assertEqual(200, resp.status_code)
以上这些都不适合我(Django1.9,Python3.4)。找到此解决方案:
您可以通过调用对象的
cookies
属性上的load来为测试客户端设置cookies
Django的测试客户端是有状态的-将在测试之间保留cookie,并将忽略过期日期。要删除,您需要手动删除cookie或创建新客户端。-
---对于Python 3和Django 2+您使用的是什么版本的Django?在1.7中,您可以对请求设置如下Cookie:
self.client.get('xyz',cookies=Cookie.SimpleCookie())
nods-好的观点。我在本例中使用了1.4。谢谢你的提示!如果您是来rf.post
绕过csrf检查的,这个线程告诉我使用request.\u not\u enforce\u csrf\u checks=True
。这个答案使用Python 3 http.cookies库。在Python2中,使用Cookie
。要在py2和py3中实现这一点,您只需使用django.http.cookie import SimpleCookie中的:)
from django.test import TestCase
from http.cookies import SimpleCookie
class TestViewWithCookies(TestCase):
def test_votes(self):
self.client.cookies = SimpleCookie({'name': 'bla'})
response = self.client.get('/vote/2')
self.assertEqual(response.status_code, 200)
from django.core import signing
self.client.cookies.load({
'example': '123',
'signed_example': signing.get_cookie_signer('signed_example').sign('123')
})