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

如何在Django响应对象中查找位置URL?,django,httpresponse,http-response-codes,Django,Httpresponse,Http Response Codes,假设我有一个Django响应对象 我想找到URL(位置)。 但是,响应标头实际上并不包含位置或内容位置字段 如何从这个响应对象确定它显示的URL?响应不决定URL,请求决定URL 响应提供的是响应的内容,而不是响应的url。这很旧,但我在进行单元测试时遇到了类似的问题。下面是我如何解决这个问题的 您可以使用response.redirect\u链和/或response.request['PATH\u INFO']获取重定向URL 也可以查看文档 但是如果有重定向,请求就不知道。@Joseph T

假设我有一个Django响应对象

我想找到URL(位置)。 但是,响应标头实际上并不包含位置或内容位置字段


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

响应不决定URL,请求决定URL


响应提供的是响应的内容,而不是响应的url。

这很旧,但我在进行单元测试时遇到了类似的问题。下面是我如何解决这个问题的

您可以使用
response.redirect\u链
和/或
response.request['PATH\u INFO']
获取重定向URL

也可以查看文档


但是如果有重定向,请求就不知道。@Joseph Turian:当然知道,它在REFERER头中:
request.META['HTTP\u REFERER']
@Josephurian:请求是从客户端读取数据,响应是向客户端发送数据。你不能告诉客户他在哪个url上,因为他已经给了你那个数据。但是,您可以告诉客户端重定向到另一个页面。因此,请求的URL(如果在重定向之后)将永远丢失。客户端没有将其保留为状态,也没有将其添加到响应中。我来这里是想找出响应的路径。但是
HttpResponse
似乎没有调用
request
redirect\u-chain
的方法。反向操作可以获取url。忘记
follow=True
确实是一件非常糟糕的事情。你没有,我有。路径信息不准确。即使URL中没有设置端口,它也会将端口设置为80,因此,这不是重建URL的明确方法。
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)