如何在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
相关产品推荐
相关产品推荐

