2012-03-13 75 views
3

我有一个视图,允许使用ajax请求动态添加标签。它看起来像这样:为什么login_required装饰器返回302状态码?

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

这是我url.py是什么样子:

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

而我的测试是这样做的:

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

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

我希望返回的状态码是一个401,因为testclient没有登录。所以第一个装饰,检查请求是否是一个帖子正在愉快地通过。然后我预计login_required装饰返回一个401,但它没有:

AssertionError: 302 != 401 

首先,我认为login_required装饰将被重定向到一些登录页面。检查了一下,我没有指定settings.LOGIN_REDIRECT_URL。那么在这种情况下login_required做了什么?

+1

您是否检查了响应位置标题? – jpic 2012-03-13 17:02:08

+0

好主意!可以将我的头撞在墙上...位置是:'http:// testserver/accounts/login /?next =/addtag /' – marue 2012-03-13 17:10:42

回答

4

@login_required如果用户未登录,则重定向到登录页面 - 因此,视图在这种情况下返回302。 (如果您没有设置LOGIN_REDIRECT_URL它使用默认值。)

+0

谢谢。并且可以在问题的评论中看到默认值;) – marue 2012-03-13 17:12:45

+0

请你能解释为什么django使用302 +位置而不是401 +位置标题?我不记得任何防止使用401 +位置的RFC。 – jpic 2012-03-13 17:15:44

+0

@jpic:401通常与HTTP访问授权一起使用。 – mipadi 2012-03-13 17:26:57

相关问题