【发布时间】:2015-08-20 18:16:01
【问题描述】:
我正在尝试测试User 模型并在Python 3.4 环境中查看,但我在解决问题时遇到了困难。
在我的应用中,只有员工用户才能添加/删除/修改用户配置文件。因此,在setUp 上,我创建了一个设置了字段 is_staff 的管理员用户。然后,在测试用例中,我强制以该管理员用户身份进行身份验证,这应该允许我创建一个新用户。这段代码如下所示:
class UserTests(APITestCase):
def setUp(self):
self.admin = User(username='admin', password='pass', is_staff=True)
self.admin.save()
def test_create_user(self):
"""
Ensure we can create a new user object without any optional fields.
"""
url = reverse('user-list')
data = {'username': 'adam', 'is_staff': False}
self.client.force_authenticate(user='admin')
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(response.data, data)
运行此测试用例会导致以下错误跟踪:
Error
Traceback (most recent call last):
File "/Users/Jonathan/GitHub/h2oiq_api/h2oiq_api/test.py", line 19, in test_create_user
response = self.client.post(url, data, format='json')
.
.
.
File "/Users/Jonathan/.virtualenvs/h2oiq-api/lib/python3.4/site-packages/rest_framework/test.py", line 90, in post
return self.generic('POST', path, data, content_type, **extra)
File "/Users/Jonathan/.virtualenvs/h2oiq-api/lib/python3.4/site-packages/rest_framework/views.py", line 359, in initial
self.check_permissions(request)
.
.
.
File "/Users/Jonathan/.virtualenvs/h2oiq-api/lib/python3.4/site-packages/rest_framework/views.py", line 304, in check_permissions
if not permission.has_permission(request, self):
File "/Users/Jonathan/.virtualenvs/h2oiq-api/lib/python3.4/site-packages/rest_framework/permissions.py", line 55, in has_permission
return request.user and request.user.is_staff
AttributeError: 'str' object has no attribute 'is_staff'
有人可以详细说明为什么缺少此属性吗?我已经彻底阅读了 Django REST 框架文档,尤其是 APIClient、Permissions 和 BasicAuthentication 指南,但我无法找到有关此问题的任何其他信息。我已尝试将强制身份验证注释掉,但这并没有解决任何问题。
感谢您提供任何帮助或见解!我正在学习 Django REST。
【问题讨论】:
-
IIRC
force_authenticate()应该得到一个用户对象,而不是用户名的字符串。所以self.client.force_authenticate(user=self.admin)在你的情况下。 -
@Jkdc 非常感谢。如此简单的修复!
-
很高兴为您提供帮助!我会提交它作为答案。
标签: django python-3.x django-models django-views django-rest-framework