Django-从HttpResponse对象检索URL?

时间:2018-09-15 14:23:26

标签: python django

在Django测试用例中,如何从HttpResponse对象获取网址?

如果我有以下Django应用程序:

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('httpresponse/', views.http_response, name='http_response'),
]

views.py

from django.shortcuts import render

def http_response(request):
    return render(request, template_name='home.html')

tests.py

from django.test import TestCase
from django.urls import reverse

http_response = reverse('http_response')

class TestTemplateResponse(TestCase):
    def test_http_response(self):
        response = self.client.get(http_response)
        self.assertEqual(response.url, http_response)

单元测试失败,并显示以下消息:

AttributeError: 'HttpResponse' object has no attribute 'url'

有什么方法可以使客户端返回Response对象而不是HttpResponse吗?

1 个答案:

答案 0 :(得分:0)

从上面给出的代码和您的注释中可以看出,如果用户通过身份验证,则尝试将用户重定向到主页不匹配。在上面的代码中,如果有人正在访问/httpresponse,那么您只是在渲染一个模板(返回HttpResponse)。

HttpResponse对象没有url属性。现在,如果您将login_required装饰器用于已编写的视图,它将把unauthenticated用户重定向到登录页面。在这种情况下,redirect将返回一个确实具有HttpResponseRedirect属性的url实例。

Django源代码:https://github.com/django/django/blob/d6aff369ad33457ae2355b5b210faf1c4890ff35/django/http/response.py#L465

因此,要测试在访问singup时是否将经过身份验证的用户重定向到主页视图,您应该首先为经过身份验证的用户设置重定向。然后,您应该能够访问响应的url属性。