加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Pytest-django:设置用户权限

发布时间:2020-12-20 11:57:53 所属栏目:Python 来源:网络整理
导读:我使用pytest 3.0.6和pytest- django 3.1.2为Django工作.我有这个非常简单的测试失败,我不明白发生了什么: # test_mytest.pyimport pytestfrom django.contrib.auth.models import Permissionfrom django.contrib.contenttypes.models import ContentType@p
我使用pytest 3.0.6和pytest- django 3.1.2为Django工作.我有这个非常简单的测试失败,我不明白发生了什么:

# test_mytest.py
import pytest
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType


@pytest.mark.django_db
def test_user_has_perm(django_user_model):
    # Create a new user
    john_doe = django_user_model.objects.create_user('johndoe',email='jd@example.com',password='123456')

    # Get or create the permission to set on user
    user_ct = ContentType.objects.get(app_label='auth',model='user')
    p,_ = Permission.objects.get_or_create(content_type=user_ct,codename='delete_user',name="Can delete user")

    # User don't have the permission
    assert john_doe.has_perm(p) is False

    # Set permission to user
    john_doe.user_permissions.add(p)
    assert john_doe.has_perm(p) is True  # ---> FAIL

以防万一,测试结果如下:

$pytest
============================= test session starts =============================
platform win32 -- Python 3.5.3,pytest-3.0.6,py-1.4.32,pluggy-0.4.0
Django settings: testsite.settings (from ini file)
rootdir: D:Devfossdjango-modern-rpc,inifile: tox.ini
plugins: pythonpath-0.7.1,django-3.1.2,cov-2.4.0
collected 1 items

modernrpcteststest_test_test.py F

================================== FAILURES ===================================
_____________________________ test_user_has_perm ______________________________

django_user_model = <class 'django.contrib.auth.models.User'>

    @pytest.mark.django_db
    def test_user_has_perm(django_user_model):
        # Create a new user
        john_doe = django_user_model.objects.create_user('johndoe',password='123456')

        # Get or create the permission to set on user
        user_ct = ContentType.objects.get(app_label='auth',model='user')
        p,name="Can delete user")

        # User don't have the permission
        assert john_doe.has_perm(p) is False

        # Set permission to user
        john_doe.user_permissions.add(p)
>       assert john_doe.has_perm(p) is True  # ---> FAIL
E       assert False is True
E        +  where False = <bound method PermissionsMixin.has_perm of <User: johndoe>>(<Permission: auth | user | Can delete user>)
E        +    where <bound method PermissionsMixin.has_perm of <User: johndoe>> = <User: johndoe>.has_perm

modernrpcteststest_test_test.py:20: AssertionError
========================== 1 failed in 0.32 seconds ===========================

配置块,来自tox.ini:

[pytest]
DJANGO_SETTINGS_MODULE = testsite.settings
norecursedirs = .git __pycache__ build dist venv* .tox .vscode .cache *.egg-info
python_paths = modernrpc/tests
testpaths = modernrpc/tests
python_files = test_*.py dummy_*.py

以及来自测试设置的数据库配置:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR,'modern_rpc.sqlite3'),},}

我究竟做错了什么 ?

解决方法

你需要使用字符串’app_label.codename’:

Returns True if the user has the specified permission,where perm is in the format “<app label>.<permission codename>”.

此外,如果自上次调用has_permor以来已更改权限,则必须清除user._perm_cache和user._user_perm_cache,以从db中检索此用户的新实例,以确保没有缓存:

del john_doe._perm_cache
 del john_doe._user_perm_cache 
 # OR
 john_doe = django_user_model.objects.get(username='johndoe')

这是因为has_perm将调用auth后端,后端将首先查询这些缓存.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读