如何修改Django decorator实现未认证跳登录、无权限跳404?
解决方案
你当前使用的user_passes_test默认会将所有验证不通过的请求都重定向到登录页,无法区分「未登录」和「已登录但权限不足」两种场景,你可以自定义装饰器逻辑来实现需求,修改后的代码如下:
from django.contrib.auth import REDIRECT_FIELD_NAME from django.contrib.auth.views import redirect_to_login from django.http import Http404 from functools import wraps def is_student(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None): def decorator(view_func): @wraps(view_func) def _wrapped_view(request, *args, **kwargs): # 先判断是否未登录 if not request.user.is_authenticated: # 未登录则重定向到登录页 path = request.build_absolute_uri() return redirect_to_login(path, login_url, redirect_field_name) # 已登录的情况下判断权限 if request.user.role != 'student': # 权限不足直接抛出404 raise Http404 # 验证通过执行原视图 return view_func(request, *args, **kwargs) return _wrapped_view if function: return decorator(function) return decorator
逻辑说明
- 未通过身份验证的请求会走默认的登录重定向逻辑,和原装饰器行为一致
- 已登录但角色不为
student的请求会直接抛出404异常,Django会自动渲染项目配置的404页面返回给用户 - 装饰器保留了原有的入参配置,使用方式和你之前的写法完全一致
内容的提问来源于stack exchange,提问作者sixovov947
相关产品推荐
相关产品推荐

