如何在Django响应对象中找到位置URL?

9

假设我有一个Django响应对象。

我想找到URL(位置)。 然而,响应头实际上没有Location或Content-Location字段。

如何从这个响应对象中确定它正在显示的URL?

2个回答

10

虽然这篇文章有些年头,但我在进行单元测试时遇到了类似的问题。这是我解决问题的方法:

你可以使用 response.redirect_chain 或者 response.request['PATH_INFO'] 获取重定向 URL。

同时查看文档:Django 测试工具:assertRedirects

from django.core.urlresolvers import reverse
from django.test import TestCase


class MyTest(TestCase)
    def test_foo(self):
        foo_path = reverse('foo')
        bar_path = reverse('bar')
        data = {'bar': 'baz'}
        response = self.client.post(foo_path, data, follow=True)
        # Get last redirect
        self.assertGreater(len(response.redirect_chain), 0)
        # last_url will be something like 'http://testserver/.../'
        last_url, status_code = response.redirect_chain[-1]
        self.assertIn(bar_path, last_url)
        self.assertEqual(status_code, 302)
        # Get the exact final path from the response,
        # excluding server and get params.
        last_path = response.request['PATH_INFO']
        self.assertEqual(bar_path, last_path)
        # Note that you can also assert for redirects directly.
        self.assertRedirects(response, bar_path)

我来这里是想了解响应的路径。但是似乎 HttpResponse 没有叫做 request 或者 redirect_chain 的方法。不过,reverse 可以用于获取 URL。 - Jonathan
1
忘记写 follow=True 真的很糟糕。你没有写,我却写错了。https://code.djangoproject.com/ticket/10971 - aliteralmind
PATH_INFO 不准确。即使在 URL 中没有设置端口,它也会将端口设置为 80,因此,这不是重建 URL 的确定方法。 - pupeno

5

响应并不决定URL,请求才是。

响应只提供响应内容,而不是其URL。


3
但是如果有重定向,请求就不知道了。 - Joseph Turian
2
@Joseph Turian:当然可以,在参考者标头中:request.META ['HTTP_REFERER'] - Daniel Roseman
@JosephTurian:请求是用于从客户端读取数据,响应是用于向客户端发送数据。您无法告诉客户端他所在的URL,因为他已经提供了这些数据。但是,您可以告诉客户端重定向到另一个页面。 - Wolph
所以,如果请求的URL经过重定向,它就永远丢失了。客户端不会将其保留为状态,也不会将其添加到响应中。 - pupeno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接