gpt4 book ai didi

django - 将整个 django 应用程序限制为普通用户

转载 作者:行者123 更新时间:2023-12-04 15:44:12 26 4
gpt4 key购买 nike

我没有为管理页面使用 django 内置管理面板,但我正在尝试添加像 django-admin 这样的功能。我想限制普通用户使用管理应用程序,为此我会像这样检查 如果在我想限制的每个功能中都不是 request.user.is_superuser。它做得很好,但在应用程序中可以有这么多功能,我必须在应用程序内的每个功能中检查它,我认为这不应该是好的解决方案。那么有什么解决方案可以让我只允许 super 用户访问整个管理功能,而无需在管理员内部的每个功能中使用 if not request.user.is_superuser 检查用户应用程序?

View .py

    def a(request):
if not request.user.is_superuser:
return redirect('login')
..........

def b(request):
if not request.user.is_superuser:
return redirect('login')
.............

def c(request):
if not request.user.is_superuser:
return redirect('login')
...........

def d(request):
if not request.user.is_superuser:
return redirect('login')
....

最佳答案

自定义装饰器

装饰器.py

from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.decorators import user_passes_test


def superuser_only(view_func=None, redirect_field_name=REDIRECT_FIELD_NAME,
login_url='login'):
"""
Decorator for views that checks that the user is logged in and is a staff
member, redirecting to the login page if necessary.
"""
actual_decorator = user_passes_test(
lambda u: u.is_active and u.is_superuser,
login_url=login_url,
redirect_field_name=redirect_field_name
)
if view_func:
return actual_decorator(view_func)
return actual_decorator

装饰器应用到您的所有网址

网址.py

def dec_patterns(patterns):
decorated_patterns = []
for pattern in patterns:
callback = pattern.callback
pattern.callback = superuser_only(callback)
pattern._callback = superuser_only(callback)
decorated_patterns.append(pattern)
return decorated_patterns

url_patterns = [
path("my-path/", views.my_view),
]
url_patterns = dec_patterns(url_patterns)

关于django - 将整个 django 应用程序限制为普通用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56592399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com