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装饰器时有太多的登录重定向?