2012-03-13 10 views
3

私はajaxリクエストでタグを動的に追加できるビューを持っています。それは次のようになります。なぜlogin_requiredデコレータは302ステータスコードを返しますか?

urlpatterns = patterns('', 
         url(r'^addtag/$',addtag, name='addtag'), 
        ) 

そして、私のテストはそれをやっている:

@require_POST 
@login_required 
def addtag(request): 
    """ 
    a view to create a new tag in the tag database 
    """ 
    some logic here 

は、これは私のurl.pyのように見えるものである

def test_addtag(self): 
    url='^addtag/$' 

    response = self.client.post(url,{'addtag':'"new tag"'}) 
    self.assertEqual(response.status_code,401) 

私はに返されるステータスコードを予想しましたtestclientがログインしていないので、401である必要があります。最初のデコレータは、リクエストがポストかどうかを確認しています。そして、私は401を返すようにlogin_requiredデコレータを期待したが、それはしませんでした:

AssertionError: 302 != 401 

まず私はlogin_requiredデコレータは、いくつかのログインページにリダイレクトされるだろうと思いました。私がsettings.LOGIN_REDIRECT_URLを指定していないことを確認しました。では、この場合login_requiredは何をしていますか?

+1

レスポンスのロケーションヘッダーを確認しましたか? – jpic

+0

素晴らしいアイデア!いくつかの壁に頭を打つことができました...場所は:http:// testserver/accounts/login /?next =/addtag/' – marue

答えて

4

@login_requiredユーザーがログインしていない場合は、ログインページにリダイレクトされます。そのため、ビューはこのような場合に302を返します。 (LOGIN_REDIRECT_URLを設定しなかった場合、デフォルト値が使用されます)

+0

ありがとうございました。そして、デフォルト値は質問へのコメントに見ることができます;) – marue

+0

あなたは401 + Locationヘッダの代わりにDjangoが302 + Locationを使用する理由を説明できますか?私は401 +の場所を使用することを防ぐRFCで何も覚えていません。 – jpic

+0

@jpic:401は、通常、HTTPアクセス許可と組み合わせて使用​​されます。 – mipadi