首页 > 解决方案 > 在 django (pytest) 中使用权限测试登录保护页面

问题描述

我正在尝试测试到目前为止仅显示模板的视图。要访问视图,用户需要权限'projects.can_view'

我正在尝试使用夹具在测试数据库中创建具有此权限的用户,然后尝试使用数据库中用户的用户名和密码登录客户端。我尝试访问该视图,但出现 302 错误(重定向到登录视图。)我可以验证我实际上是否正确传递了权限:

我的夹具:

@pytest.fixture()
def create_users_with_permissions():
    User = get_user_model()
    u = User.objects.create(
        username="test",
        password="pass",
    )

    permission = Permission.objects.get(name='Can view project')
    u.user_permissions.add(permission)
    u = User.objects.get(username='test')
    print(u.has_perm('appname.view_project'))
    return u

我再次查询用户以删除权限缓存,如文档中所述(https://docs.djangoproject.com/en/3.0/topics/auth/default/)。当我打印出来print(u.has_perm('appname.view_project'))它返回True。因此,我假设我创建了一个具有此特定权限的用户。

现在我将fixture传递给我的测试并将pytests client-fixture记录在:

    def test_xyz(
        self, client, create_users_with_permissions
    ):

        client.login(
            username=create_users_with_permissions.username,
            password=create_users_with_permissions.password
        )
        url = reverse('urlforview')
        response = client.get(url)
        assert response.status_code == 200

这失败并显示错误代码:assert 302 == 200

如果我在数据库中创建一个超级用户并使用相应的用户登录它就可以工作。当我硬编码用户名和密码时,它也失败了。我在这里想念什么?

感谢您的每一个帮助或建议,非常感谢!

我的观点只有这个:

class ProjectCustomerList(PermissionRequiredMixin, TemplateView):
    template_name = 'mytemplate.html'
    permission_required = 'projects.can_view'

标签: pythondjangopytestfixtures

解决方案


推荐阅读