【问题标题】:Why does assertRedirects() expect a string rather than a URL?为什么 assertRedirects() 需要一个字符串而不是 URL?
【发布时间】:2014-05-18 07:00:50
【问题描述】:

为什么这两个断言有效:

from django.test import TestCase

class MyTests(TestCase):
    def test_1(self):
        response = self.client.get(reverse_lazy('create_cm')) 
        self.assertRedirects(response, reverse('upload_booth'))
        self.assertRedirects(response, str(reverse_lazy('upload_booth')))

但这不是:

self.assertRedirects(response, reverse_lazy('upload_booth'))

而不是产生此错误消息:

文件 "/usr/local/lib/python2.7/dist-packages/django/test/testcases.py", 第 300 行,在 assertRedirects 中 e_query, e_fragment))
文件“/usr/lib/python2.7/urlparse.py”,第 234 行,在 urlunsplit url = '//' + (netloc or '') + url TypeError: coercing to Unicode: need string or buffer, proxy found

reverse 和 reverse_lazy 的返回值到底有什么不同,为什么不同?

【问题讨论】:

    标签: django django-testing


    【解决方案1】:

    惰性函数的实现在实例化时直接返回值,而是返回一个代理对象。当对该对象的特定调用发生时,它的真实值会被评估并返回。

    如果是reverse_lazy,您可以在自己的示例中看到这一点:

    str(reverse_lazy('upload_booth'))
    

    这是对代理对象的__str__ 方法的调用,然后真正返回一个字符串而不是代理对象。

    所有实现细节都可以在Django docs.找到

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多