Django 为什么assertRedirects()需要字符串而不是URL?

Django 为什么assertRedirects()需要字符串而不是URL?,django,django-testing,Django,Django Testing,为什么这两个断言有效: 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(r

为什么这两个断言有效:

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_查询,e_片段))
文件“/usr/lib/python2.7/urlparse.py”,第234行,在urlunsplit中 url='/'+(netloc或“”)+url类型错误:强制使用Unicode:需要字符串或缓冲区,找到代理


reverse和reverse_lazy的返回值到底有什么区别?为什么它们不同?

惰性函数的实现不会在实例化时直接返回值,而是返回代理对象。当对该对象进行特定调用时,将计算并返回其实际值

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

str(reverse_lazy('upload_booth'))
这是对代理对象的
\uuu str\uu
方法的调用,然后实际返回一个字符串而不是代理对象

所有实施细节可在