【问题标题】:django test client always returning 301django 测试客户端总是返回 301
【发布时间】:2013-07-28 19:37:07
【问题描述】:

我在运行墨盒测试时遇到了一些问题 - 测试客户端在执行 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/'

即使我尝试直接访问给定的 URL:

>>> response = self.client.get('http://example.com/en/', follow=True)
>>> response.redirect_chain
[('http://example.com/en/', 301)]

其中“example.com”只是网站的实时网址。你知道为什么会发生这种情况吗?它重定向到 example.com(或者至少假装它似乎仍然在本地运行)而不是 localhost 是否正常?

【问题讨论】:

    标签: django django-testing mezzanine cartridge


    【解决方案1】:

    您还可以设置一个 secure 标志来解决重定向到 https 的问题。就我而言,我测试了post:

    response = self.client.post(url, data, secure=True)
    

    但是client.get() 也有这个标志。

    【讨论】:

      【解决方案2】:

      通常,我在写问题时已经找到了答案……希望这对其他人有用!

      SSL 配置不知何故潜入了我的开发设置。特别是我有以下

      SSL_FORCE_HOST = 'example.com'
      

      启用,这似乎是一个问题-在开发中禁用它后,问题就消失了。

      【讨论】:

      • 在测试我的 django 视图时,我莫名其妙地得到了 301 PermanentRedirect,并且已经没有想法了。您的问题和回答让我意识到 SSL 设置正在产生重定向。
      • 我也是,我有一个导致 301 状态代码的 ssl 中间件设置。没有你的线索可能会花费我很多时间。谢谢!
      • 我使用 django-sslify 也是如此。需要from django.test.utils import override_settings 并在我的TestCase 类上使用装饰器@override_settings(SSLIFY_DISABLE=True)。适用于 Django 1.4+
      • 我的单元测试因为这个原因而失败了。我只是在测试时关闭了 sslify。 if bool(int(os.getenv("IN_PRODUCTION", 1))) == 1: MIDDLEWARE_CLASSES = tuple(['sslify.middleware.SSLifyMiddleware'] + list(MIDDLEWARE_CLASSES))
      • 这对我来说不是 SSL,但这让我意识到我正在使用部署配置文件运行我的测试,而不是开发。
      【解决方案3】:

      检查它是否正在运行测试并在settings.py 中启用了调试。在禁用调试的情况下运行可能会导致重定向。

      DEBUG = True
      

      我在修改为默认禁用调试的代码库中遇到了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-18
        • 1970-01-01
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多