2013-07-28 12 views
9

私はカートリッジテストを実行中にいくつかの問題に遭遇しました。テストクライアントはself.client.get( '/')のようなことをすると常に301を返します。続行する唯一の方法は、follow = Trueを追加することですが、私は常にそれを実行しなければならないと疑っています。これはまた、test client always uses GET for redirects以降、POSTをテストできないことを意味します。djangoテストクライアントが常に返す301

私はいくつかの場所でカートリッジを変更しました。これは間違いなく私のせいですが、どうやってデバッグするのか分かりません。ここでは何が起こるかです:

>>> response = self.client.get('/en/', follow=True) 
>>> response.status_code 
200 
>>> response.redirect_chain 
[('http://example.com/en/', 301)] 

>>> response = self.client.get('http://example.com/en/') 
>>> response.status_code 
301 
>>> response['Location'] 
'http://example.com/en/' 

私は与えられたURLに直接アクセスしようとしても:

>>> response = self.client.get('/en/') 
>>> response.status_code 
301 
>>> pp response.__dict__ 
{'_base_content_is_iter': False, 
'_charset': 'utf-8', 
'_closable_objects': [], 
'_container': [u''], 
'_handler_class': None, 
'_headers': {'content-language': ('Content-Language', 'en'), 
       'content-type': ('Content-Type', 'text/html; charset=utf-8'), 
       'location': ('Location', 'http://example.com/en/'), 
       'vary': ('Vary', 'Accept-Language, Cookie')}, 
'client': <django.test.client.Client object at 0x1105364d0>, 
'context': None, 
'cookies': <SimpleCookie: >, 
'request': {u'CONTENT_TYPE': 'text/html; charset=utf-8', 
      u'PATH_INFO': '/en/', 
      u'QUERY_STRING': '', 
      u'REQUEST_METHOD': 'GET'}, 
'templates': []} 

そして、次のリダイレクトと

>>> response = self.client.get('http://example.com/en/', follow=True) 
>>> response.redirect_chain 
[('http://example.com/en/', 301)] 

'example.com' だけですサイトはURLを生きています。それが起こっているかもしれない理由がありますか? localhostのかわりにexample.comにリダイレクトするのは正常ですか(または少なくとも、それはまだローカルで実行されているようです)?

答えて

6

標準的に私は質問を書いている間に答えを見つけました。うまくいけば、これは他の誰かにとって役に立ちます!

何とか私の開発者の設定にSSL設定snuck。 DEVでそれを無効にした後、問題が消えた - 特に私は、次の

SSL_FORCE_HOST = 'example.com' 

が問題であるように思われ、有効に持っていました。

+3

私はdjangoのビューをテストするときにわざと301のPermanentRedirectを取得し、アイデアがなくなりました。あなたの質問と回答は、SSL設定がリダイレクトを生成していたことに気付きました。 – Andres

+1

私も301のステータスコードを引き起こしたsslミドルウェア設定がありました。あなたの手がかりなしで、おそらく私に多くの時間を要したでしょうか?ありがとう! – Bentley4

+3

私と同じdjango-sslifyを使用しています。 'django.test.utils import override_settings'から' 'TestCase'クラスでデコレータ' @override_settings(SSLIFY_DISABLE = True) 'を使う必要がありました。 Django 1.4+の作業 – dghubble

0

また、secureフラグを設定して、httpsへのリダイレクトの問題を解決することもできます。私の場合は、postをテストした:

self.response = self.client.post(url, data, secure=True) 

しかしclient.get()も、このフラグを持っています。

関連する問題