You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:09:02