3

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

1)重定向的证据:

baby/urls.py
来自 django.conf.urls 导入模式、包含、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()

重击结果:

(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) 没有发布数据的证据

婴儿/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',
4

2 回答 2

2

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

FWIW,如果您为视图设置了登录/身份验证,请检查您的 client_stub 登录是否成功。我本来希望有一个例外:

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

它根本没有抱怨,但事实上,我的用户名和密码没有设置,登录失败。进一步测试的实际 url 是由于登录失败而导致登录页面的 302。

于 2014-10-31T23:45:47.523 回答
0

从您自己的 pdb 转储中,

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

某处,请求被重新路由以将您推送到/consumer/create_order/

  • 检查您的 urls.py 以确保一切都正确连接
  • 检查您的中间件以确保它没有发回重定向
  • 检查您的 create_baby() 视图以确保没有逻辑错误。

如果这实际上是预期的行为,您需要知道 POST 数据在重定向后无法幸免。这是浏览器的功能,而不是 Django 中的错误。

于 2013-07-03T04:37:03.627 回答