Django Test Client Redirects Unexpectedly
当前,我正在使用TestCase发出HTTP Post请求,该请求正在被重定向并且没有发布数据。 我想发出一个发布请求而无需重定向并保留数据。 我该怎么做?
1)重定向证据:
婴儿/ urls.py
从django.conf.urls导入模式,包括url
1 2 3 4 5 | urlpatterns = patterns('babies', # Endpoints url(r'^create_baby/$', 'views.create_baby'), ... ) |
婴儿/tests.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from django.test import TestCase from django.test.client import Client import pdb class OrderCreationTest(TestCase): def setUp(self): self.normal_baby_data = { 'birth_time': { 'date' : '04-07-2013' } } def test_baby_creation(self): response = self.client.post('/consumer/create_baby/', self.normal_baby_data, follow=True ) pdb.set_trace() |
bash结果:
1 2 | (Pdb) response.redirect_chain [('https://testserver/consumer/create_baby/', 302)] |
如果follow = False,则从不创建视图的create_baby方法,也没有重定向链。 bash结果是:
1 2 | (Pdb) response.redirect_chain *** AttributeError: 'HttpResponseRedirect' object has no attribute 'redirect_chain' |
2)没有职位数据的证据
婴儿/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | def create_baby(request): pdb.set_trace() ... (Pdb) p request <WSGIRequest path:/consumer/create_baby/, GET:<QueryDict: {}>, POST:<QueryDict: {}>, COOKIES:{'sessionid': 'f88ffoplh6lyytarn9n85z6bd5lefbzo'}, META:{u'CONTENT_TYPE': 'text/html; charset=utf-8', u'CSRF_COOKIE': u'OC5LFOj8HvqTu0cKoAmty7vkYP0jNk3Q', u'HTTP_COOKIE': u' sessionid=f88ffoplh6lyytarn9n85z6bd5lefbzo; Domain=None; expires=None; Max-Age=None; Path=/; secure', u'PATH_INFO': u'/consumer/create_order/', u'QUERY_STRING': '', u'REMOTE_ADDR': '127.0.0.1', u'REQUEST_METHOD': 'GET', u'SCRIPT_NAME': u'', u'SERVER_NAME': 'testserver', u'SERVER_PORT': '80', u'SERVER_PROTOCOL': 'HTTP/1.1', u'wsgi.errors': <_io.BytesIO object at 0x10a6fa230>, u'wsgi.input': <django.test.client.FakePayload object at 0x10b067b50>, u'wsgi.multiprocess': True, u'wsgi.multithread': False, u'wsgi.run_once': False, u'wsgi.url_scheme': 'https', |
(好的,与OP的问题无关,但与Django测试客户端302非常相关)
FWIW,如果您具有用于查看的登录名/认证,请检查您的client_stub登录是否成功。我本来期望来自以下情况的例外:
1 | res = cls.client_stub.login(username=cls.username, password=cls.password) |
根本没有抱怨,但实际上,我的用户名和密码未设置,并且登录失败。实际测试的URL进一步是由于登录失败导致302进入登录页面。
从您自己的pdb转储中,
1 | <WSGIRequest path:/consumer/create_order/, ...> |
在某个地方,请求被重新路由以将您推送到
- 检查您的urls.py,确保所有内容均正确连接
- 检查您的中间件,以确保它没有发送回重定向
- 检查您的create_baby()视图以确保没有逻辑错误。
如果这实际上是预期的行为,则需要知道POST数据不能在重定向中保留下来。这是浏览器的功能,而不是Django中的错误。