Django:使用@login_required 在视图上测试失败

Posted

技术标签:

【中文标题】Django:使用@login_required 在视图上测试失败【英文标题】:Django: test failing on a view with @login_required 【发布时间】:2011-02-11 21:51:46 【问题描述】:

我正在尝试为装饰有的视图构建测试 @login_required,因为我没让它工作,所以我做了一个简单的测试 还是过不了。

这里是简单测试和视图的代码:

def test_login(self):
    user = self._create_new_user()
    self.assertTrue(user.is_active)
    login = self.client.login(username=user.username,
password=self.data['password1'])
    self.failUnless(login, 'Could not log in')
    response = self.client.get('/accounts/testlogin/')
    self.assertEqual(response.status_code, 200)

@login_required
def testlogin(request):
    print 'testlogin !! '
    return HttpResponse('OK')

_create_new_user() 正在保存用户并且里面有一个测试 方法来查看它是否有效。

在 response.status_code 中测试失败,返回 302 和 响应实例属于 HttpResponseRedirect,将其重定向为 如果没有登录。

有什么线索吗?我错过了什么?

问候 埃斯特班

【问题讨论】:

【参考方案1】:

这个测试用例对我有用:

from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.test.client import Client
import unittest

class LoginTestCase(unittest.TestCase):
    def setUp(self):
        self.client = Client()
        self.user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

    def testLogin(self):
        self.client.login(username='john', password='johnpassword')
        response = self.client.get(reverse('testlogin-view'))
        self.assertEqual(response.status_code, 200)

我建议您(如果您还没有使用它们)使用 reverse() 函数并命名您的 URL。这样您就可以确保始终获得正确的 URL。

【讨论】:

@aeby:我复制并粘贴了您的代码,仍然得到 302,您是否在视图中使用 @login_required? Django 版本 1.1.1 - 仔细检查 testlogin 视图是否在浏览器中工作,并且只有登录用户才能使用 是的,我愿意:从 django.contrib.auth.decorators 导入 login_required @login_required def testlogin(request): return HttpResponse("Test")【参考方案2】:

答案如下:

Python 2.6.5 改变了方式 cookie 被巧妙地存储 与测试客户端不兼容。 此问题已在 1.1.X 和主干分支,但修复尚未正式生效 释放。

如果您使用的是 1.1.X 和 Python 2.6.5,您将遇到任何涉及的测试活动的问题 饼干。你要么需要降级 Python,或者使用 1.1.X 分支而不是 比 1.1.1 版本。

1.1.2 版本(包括 解决您描述的问题)将 在同一时间,我们 发布 1.2 - 希望,非常非常 很快。

你的,拉斯马吉 %-)

http://groups.google.com/group/django-users/browse_frm/thread/617457f5d62366ae/05f0c01fff0b9e6d?hl=en&lnk=gst&q=2.6.5#05f0c01fff0b9e6d

【讨论】:

【参考方案3】:

好的,我也面临同样的问题@resto 解决了我的问题。

在下面以这种方式创建用户,让测试客户端让用户登录并获得重定向以外的响应(302)

self.user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

【讨论】:

以上是关于Django:使用@login_required 在视图上测试失败的主要内容,如果未能解决你的问题,请参考以下文章

Django @login_required 删除 https

使用Django自带的登录访问限制login_required

为啥Django在使用@login_required装饰器时有太多的登录重定向?

Django中 @login_required用法简介

Django 中的 login_required 装饰器和 urlresolver.reverse()

Django:使用@login_required和设置LOGIN_URL时的信息泄露问题