【问题标题】:Django REST Testing: Attribute MissingDjango REST 测试:缺少属性
【发布时间】: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 框架文档,尤其是 APIClientPermissionsBasicAuthentication 指南,但我无法找到有关此问题的任何其他信息。我已尝试将强制身份验证注释掉,但这并没有解决任何问题。

感谢您提供任何帮助或见解!我正在学习 Django REST。

【问题讨论】:

  • IIRC force_authenticate() 应该得到一个用户对象,而不是用户名的字符串。所以self.client.force_authenticate(user=self.admin)在你的情况下。
  • @Jkdc 非常感谢。如此简单的修复!
  • 很高兴为您提供帮助!我会提交它作为答案。

标签: django python-3.x django-models django-views django-rest-framework


【解决方案1】:

force_authenticate()user 争论使用用户对象,而不是用户名字符串。

所以在你的情况下你会使用

self.client.force_authenticate(user=self.admin)

【讨论】:

    猜你喜欢
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    相关资源
    最近更新 更多