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

如何在Django Rest Framework自定义中间件中阻断用户访问授权?

DRF自定义权限中间件:阻断访问与返回未授权提示

1. 中间件中返回什么可以阻断访问?

在Django中间件的process_view方法里,只要返回一个HTTP响应对象(比如HttpResponse或它的子类),就会直接终止后续的视图执行流程,把这个响应返回给用户,以此阻断访问。如果返回None,则会继续执行后续的中间件和视图函数。

2. 如何向用户返回未授权的提示信息?

针对DRF的API接口,推荐两种方式返回标准化的未授权提示:

方式一:返回DRF标准格式的JSON响应

用DRF的Response对象构造符合API规范的JSON提示,和DRF视图的响应格式保持统一,适合前后端分离场景:

from django.utils.deprecation import MiddlewareMixin
from rest_framework.response import Response
from rest_framework import status

class PermissionMiddleware(MiddlewareMixin):
    def process_view(self, request, view_func, view_args, view_kwargs):
        if request.path.startswith('/admin/'):
            return None

        if request.path.startswith('/api/'):
            is_allowed = False  # 替换为你的权限校验逻辑
            if not is_allowed:
                return Response(
                    {"detail": "您没有访问该接口的权限"},
                    status=status.HTTP_403_FORBIDDEN
                )
            return None

方式二:返回Django原生的禁止响应

如果不需要JSON格式,也可以用Django原生的HttpResponseForbidden返回纯文本提示:

from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponseForbidden

class PermissionMiddleware(MiddlewareMixin):
    def process_view(self, request, view_func, view_args, view_kwargs):
        if request.path.startswith('/admin/'):
            return None

        if request.path.startswith('/api/'):
            is_allowed = False  # 替换为你的权限校验逻辑
            if not is_allowed:
                return HttpResponseForbidden("您没有访问该接口的权限")
            return None

注意:如果你的Django版本较新,MiddlewareMixin已被弃用,建议直接继承object并实现__call__方法,上述代码基于你提供的示例结构保持兼容。

内容的提问来源于stack exchange,提问作者Nahidujjaman Hridoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:50:29