Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:在测试客户端上设置cookie?_Python_Django - Fatal编程技术网

Python Django:在测试客户端上设置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

我的Django站点是用一些中间件建立的,这些中间件在每次请求时检查cookie,如果没有设置cookie,则将用户转发到其他地方

我现在想在网站上运行一些测试。这是我的代码:

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')
})