Django仅允许管理员访问页面的自定义代码运行异常如何解决?
Django 实现仅超级管理员可访问页面的修复方案
现有代码的常见问题
- 缺少
render模块导入,运行时会直接抛出导入错误 - 未做登录状态校验,匿名用户访问时
request.user.is_superuser会直接返回False,无法自动触发登录流程,不符合常规业务逻辑 - 跳转逻辑如果使用外站链接不符合项目内的跳转规范,建议替换为项目内部路由
方案1:直接修复现有函数视图代码
from django.shortcuts import redirect, render from django.contrib.auth.decorators import login_required # 登录校验装饰器:未登录用户会自动跳转到项目默认登录页 @login_required def index(request): if not request.user.is_superuser: # 替换为项目内无权限提示页/首页的路由名即可 return redirect('home') return render(request, 'scan_debug/index.html')
方案2:用内置装饰器简化权限校验逻辑
from django.shortcuts import render from django.contrib.auth.decorators import user_passes_test # 自定义权限校验函数 def check_superuser(user): return user.is_superuser # 自动完成登录+权限校验,校验不通过默认跳登录页 @user_passes_test(check_superuser, login_url='/no-permission/') def index(request): return render(request, 'scan_debug/index.html')
可通过login_url参数自定义无权限时的跳转地址,指向项目内的自定义提示页即可。
方案3:类视图实现方案
如果使用Django类视图开发,可直接继承权限校验Mixin实现:
from django.views.generic import TemplateView from django.contrib.auth.mixins import UserPassesTestMixin class IndexView(UserPassesTestMixin, TemplateView): template_name = 'scan_debug/index.html' # 自定义无权限跳转地址 login_url = '/no-permission/' def test_func(self): return self.request.user.is_superuser
内容的提问来源于stack exchange,提问作者Alex Letetski
相关产品推荐
相关产品推荐

