2011-10-31 10 views
5

私はDjango応答オブジェクトを持っているとしましょう。DjangoレスポンスオブジェクトでロケーションURLを見つける方法は?

URL(場所)を探したいと思います。 しかし、レスポンスヘッダーには実際にLocationまたはContent-Locationフィールドは含まれていません。

このレスポンスオブジェクトから、表示されているURLをどのようにして判断できますか?

+0

何か問題があります。 –

答えて

6

レスポンスがURLを決定しないため、リクエストが行います。

レスポンスはレスポンスの内容を提供しますが、レスポンスのURLは返されません。

+0

しかし、リダイレクトがある場合、リクエストはわかりません。 –

+1

@Joseph Turian:確かに、それは参照元ヘッダーにあります: 'request.META ['HTTP_REFERER']'。 –

+0

@JosephTurian:要求はクライアントからデータを読み取るためのもので、応答はクライアントにデータを送信するためのものです。彼はすでにあなたにそのデータを与えているので、彼が何をしているのかをクライアントに知らせることはできません。あなたは別のページにリダイレクトするようにクライアントに指示することができます。 – Wolph

6

これは古いですが、単体テストの際に同様の問題が発生しました。ここで私はどのように問題を解決したのですか。

response.redirect_chainおよび/またはresponse.request['PATH_INFO']を使用して、リダイレクトURLを取得することができます。

ドキュメントもご覧ください。 Django Testing Tools: 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) 
+0

私は下の投票が何であるか知りたいです。 – pyrospade

+0

私はここで応答の経路について調べようとしています。しかし、 'HttpResponse'のように' request'や 'redirect_chain'というメソッドはありません。 URLを取得するための逆の作品です。 – Jonathan

+0

'follow = True'を忘れることは本当に非常に悪いことです。あなたはしなかった、私はした。 https://code.djangoproject.com/ticket/10971 – aliteralmind

関連する問題