Django如何针对指定POST接口跳过CSRF token校验且不全局禁用CSRF
单视图关闭CSRF校验方案
Django提供了单独标记视图免CSRF校验的装饰器,不会影响全局其他路由和后台管理页的CSRF校验逻辑,完全适配你的需求。
第一步:导入装饰器
在视图文件头部引入csrf_exempt装饰器:
from django.views.decorators.csrf import csrf_exempt
第二步:给目标函数视图加装饰器
直接在你编写的saveDataToDatabase函数上添加装饰器标记即可,修改后的完整代码如下:
from django.views.decorators.csrf import csrf_exempt import json from django.http import HttpResponseServerError @csrf_exempt def saveDataToDatabase(request): if request.method == 'POST': json_data = json.loads(request.body) try: data = json_data['data'] # 此处添加你的数据校验、落库逻辑 except KeyError: # 注意原代码缺少return,需要补充返回才能正确抛出错误响应 return HttpResponseServerError("Malformed data!")
如果你后续使用Django REST Framework类视图,可按以下方式处理
类视图不能直接加装饰器,需要用method_decorator绑定到类的dispatch方法:
from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from rest_framework.views import APIView from rest_framework.response import Response @method_decorator(csrf_exempt, name='dispatch') class FormSubmitView(APIView): def post(self, request): data = request.data.get('data') # 业务逻辑处理 return Response({"status": "success"})
注意事项
- 该接口面向未登录用户开放,建议添加接口频次限制规则,避免被恶意刷量提交垃圾数据
- 所有用户提交的字段需要做严格的格式校验,比如手机号格式校验、敏感词过滤等,避免恶意数据入库
内容的提问来源于stack exchange,提问作者ProgNow
相关产品推荐
相关产品推荐

