Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-从HttpResponse对象检索url?_Python_Django - Fatal编程技术网

Python Django-从HttpResponse对象检索url?

Python Django-从HttpResponse对象检索url?,python,django,Python,Django,在Django测试用例中,如何从HttpResponse对象获取url 如果我有以下Django应用程序: url.py views.py tests.py 单元测试失败,并显示以下消息: AttributeError:'HttpResponse'对象没有属性“url” 是否有任何方法可以让客户端返回响应对象,而不是HttpResponse?来自上面给出的代码和您的注释,您的注释表明,如果用户经过身份验证,则试图将其重定向到主页。在上面的代码中,如果有人正在访问/httpresponse,那么您

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

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

url.py views.py tests.py 单元测试失败,并显示以下消息:

AttributeError:'HttpResponse'对象没有属性“url”


是否有任何方法可以让客户端返回
响应
对象,而不是
HttpResponse

来自上面给出的代码和您的注释,您的注释表明,如果用户经过身份验证,则试图将其重定向到主页。在上面的代码中,如果有人正在访问
/httpresponse
,那么您只是在呈现一个模板(返回
httpresponse

HttpResponse
对象没有
url
属性。现在,如果您要对所编写的视图使用
login\u required
decorator,它会将
未经身份验证的
用户重定向到登录页面。在这种情况下(
redirect
),将返回一个
HttpResponseRedirect
实例,该实例实际上具有
url
属性

Django源代码:


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

我认为您无法从响应对象获取url,尽管您可以从请求获取url。但我很难理解你为什么要这么做。URL属于请求,而不是响应。Django使用它在
urls.py
中查找您想要运行哪个代码来生成
HttpResponse
对象,当它得到这个对象时,它会在后台将其转换为实际的HTTP响应以发送回客户机。响应与原始请求所指向的URL无关。不确定要测试什么。HTTP响应通常没有URL,它返回您请求的URL的内容。在浏览器中,HTTP原始响应没有URL部分。因此
HttpResponse
对象也没有
url
属性。人们可能想测试的是是否有任何重定向。但是,您的响应将具有不同的状态代码(例如301或302),并且响应实际上具有
url
属性。@dirkgroten感谢您的回复。如果用户已通过身份验证,并且他们试图访问
注册
页面,我会将他们重定向到
主页
。我尝试使用
response=self.client.get(…)
self.assertRedirects(response,home)
为此编写一个单元测试,但它不断地给我上述错误
templaterresponse
HttpResponse
对象可以从self.client.get返回,并且它们没有
url
参数。将
follow=True
选项添加到
get()
调用中。这将遵循重定向,然后
self.assertRedirects(响应,主页)
也会起作用。
from django.urls import path
from . import views

urlpatterns = [
    path('httpresponse/', views.http_response, name='http_response'),
]
from django.shortcuts import render

def http_response(request):
    return render(request, template_name='home.html')
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)