我正在尝试在 django 中创建自定义管理面板。我可以在那里创建用户,并且可以检查用户是否
is_admin
。如果用户不是管理员,他不应该能够访问管理面板页面,也不应该能够修改任何内容。
我需要创建中间件来检查用户是否是管理员,如果不是,则将其重定向到主页。我认为我应该使用
@permission_required
,但我不确定如何在中间件中使用它。
这是创建新用户的功能:
# views.py
def createNewUser(request):
if request.method == 'POST':
user = User.objects.create(username=request.POST.get('username'),
email=request.POST.get('email'),
password=request.POST.get('password'))
if request.POST.get('is_admin') == 'True':
is_admin = 'True'
else:
is_admin = 'False'
user.user_permissions.clear()
user.save()
useraccount = UserAccount.objects.create(user=user, is_admin=is_admin)
useraccount.save()
return redirect('users')
return render(request, 'adminpanel/create_user.html', {})
该用户可以是管理员。如果我不选中复选框,则他不是管理员,并且不允许他在此页面上执行任何操作。我只是清除所有权限。(我知道删除特定权限可能比删除全部权限更好,但这只是一个示例) 现在我必须在每个函数之前检查他的权限:
@permission_required('poll.view_category', login_url='home')
def home(request):
return render(request, 'adminpanel/main.html', {})
那么,如何在中间件中使用这个装饰器呢? (它只能在管理面板请求中调用) 使用函数中间件和基于类的中间件哪个更好?有什么区别?
中间件检查每个请求,因此可能不是限制对单个视图甚至几个视图的访问的最有效方法。使用装饰器可能是更好的选择。
最简单的方法就是检查视图顶部
def home(request):
if not request.user.useraccount.is_admin
return render(request, 'login.html', {})
如果您想在多个视图中重复使用此逻辑,您可以使用 user_passes_test 装饰器
from django.contrib.auth.decorators import user_passes_test
def admin_check(user):
return user.useraccount.is_admin
@user_passes_test(admin_check)
def my_view(request):
如果您想在多个应用程序中使用它而不重新创建测试,您可以使用 lambda 函数
@user_passes_test(lambda u: u.useraccount.is_admin)
我个人的偏好是先了解基于函数的视图,然后再了解基于类的视图,这样您就知道基于类的视图在幕后为您做什么。当您使用基于上面的函数时,我暂时会坚持使用它们。