Django测试客户端意外重定向

Django测试客户端意外重定向,django,unit-testing,testing,Django,Unit Testing,Testing,目前,我正在使用TestCase发出HTTP Post请求,该请求正在被重定向,并且没有Post数据。我想在不重定向的情况下发出post请求并保留数据。我该怎么做 1) 重定向的证据: baby/url.py 从django.conf.url导入模式,包括,url urlpatterns = patterns('babies', # Endpoints url(r'^create_baby/$', 'views.create_baby'), ... ) 婴儿/测试.py from

目前,我正在使用TestCase发出HTTP Post请求,该请求正在被重定向,并且没有Post数据。我想在不重定向的情况下发出post请求并保留数据。我该怎么做

1) 重定向的证据:

baby/url.py
从django.conf.url导入模式,包括,url

urlpatterns = patterns('babies',
  # Endpoints
  url(r'^create_baby/$', 'views.create_baby'),
  ...
)
婴儿/测试.py

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结果:

(Pdb) response.redirect_chain
[('https://testserver/consumer/create_baby/', 302)]
如果follow=False,则永远不会创建视图的create_baby方法,并且也没有重定向链。bash结果是:

(Pdb) response.redirect_chain
*** AttributeError: 'HttpResponseRedirect' object has no attribute 'redirect_chain'
2) 没有post数据的证据

babyes/views.py

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',
def创建婴儿(请求):
pdb.set_trace()
...
(Pdb)p请求

从您自己的pdb转储

<WSGIRequest path:/consumer/create_order/, ...>

在某个地方,请求被重新路由,将您推到
/consumer/create\u order/

  • 检查你的URL.py以确保所有内容都已正确连接
  • 检查您的中间件,确保它没有发回重定向
  • 检查create_baby()视图以确保没有逻辑错误
如果这实际上是预期的行为,那么您需要知道POST数据不会在重定向后生存。这是浏览器的一项功能,而不是Django中的一个bug。

(好的,与OP的问题无关,但与Django测试客户端302非常相关)

FWIW,如果您为视图准备了登录/身份验证,请检查您的客户端存根登录是否成功。我本以为会出现以下例外情况:

res = cls.client_stub.login(username=cls.username, password=cls.password)

它一点也不抱怨,但事实上,我的用户名和密码没有设置,登录失败。正在进一步测试的实际url将302发送到登录页面,登录失败。

Hey Thomas,感谢您的快速响应。在发布到stackoverflow之前,我正在更改变量名。其实应该是。另外,我知道POST数据无法通过重定向,所以现在我正试图弄清楚为什么在第一个位置有重定向。也许你应该在
django.shortcuts.redirect中放置一个跟踪点