我在运行盒式磁带测试时遇到了一些问题 - 测试客户端在执行self.client.get('/')之类的操作时总是返回301。唯一的方法是添加follow = True,但我总是必须这样做。这也意味着我无法测试POST,因为test client always uses GET for redirects。
我在几个地方修改了墨盒,所以这绝对是我的错,但我不知道如何调试它。这是发生的事情:
>>> response = self.client.get('/en/')
>>> response.status_code
301
>>> pp response.__dict__
{'_base_content_is_iter': False,
'_charset': 'utf-8',
'_closable_objects': [],
'_container': [u''],
'_handler_class': None,
'_headers': {'content-language': ('Content-Language', 'en'),
'content-type': ('Content-Type', 'text/html; charset=utf-8'),
'location': ('Location', 'http://example.com/en/'),
'vary': ('Vary', 'Accept-Language, Cookie')},
'client': <django.test.client.Client object at 0x1105364d0>,
'context': None,
'cookies': <SimpleCookie: >,
'request': {u'CONTENT_TYPE': 'text/html; charset=utf-8',
u'PATH_INFO': '/en/',
u'QUERY_STRING': '',
u'REQUEST_METHOD': 'GET'},
'templates': []}
以及以下重定向:
>>> response = self.client.get('/en/', follow=True)
>>> response.status_code
200
>>> response.redirect_chain
[('http://example.com/en/', 301)]
>>> response = self.client.get('http://example.com/en/')
>>> response.status_code
301
>>> response['Location']
'http://example.com/en/'
即使我尝试直接转到指定的网址:
>>> response = self.client.get('http://example.com/en/', follow=True)
>>> response.redirect_chain
[('http://example.com/en/', 301)]
其中'example.com'只是网站直播网址。你有什么想法可能会发生吗?重定向到example.com(或者至少假装,它似乎仍在本地运行)而不是localhost是正常的吗?
答案 0 :(得分:7)
标准地说,我在写这个问题时已经找到了答案......希望这对其他人有用!
不知何故,SSL配置进入我的开发设置。特别是我有以下
SSL_FORCE_HOST = 'example.com'
启用,这似乎是一个问题 - 在开发中禁用它后,问题就消失了。
答案 1 :(得分:1)
还可以设置secure
标志,以解决重定向到https的问题。就我而言,我测试了post
:
response = self.client.post(url, data, secure=True)
但client.get()
也有此标志。
答案 2 :(得分:0)
检查它是否在 settings.py
中启用调试的情况下运行测试。在禁用调试的情况下运行可能会导致它重定向。
DEBUG = True
我在修改为默认禁用调试的代码库中遇到了这个问题。