不使用Django REST Framework时Flutter HTTP POST对接Django的CSRF报错如何解决
问题解决方案
报错原因
Django默认开启CSRF(跨站请求伪造)防护校验,所有POST类请求默认需要携带合法的CSRF token才能通过校验,Flutter端发起的POST请求未携带对应token,因此触发403报错。
可用解决方法
方法1:给指定视图添加CSRF豁免(最推荐,不影响全站其他功能的安全防护)
导入csrf_exempt装饰器,加在对应视图函数上即可豁免该接口的CSRF校验,修改后的代码如下:
from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def index1(request): # 注意:原代码直接传入request.POST作为查询参数属于错误写法,需要先提取对应字段 user_id = request.POST.get('id') cursor.execute('select * from users where id = %s', [user_id]) response = list(cursor.fetchall()) return JsonResponse(response, safe=False)
方法2:全局关闭CSRF校验(不推荐,会降低全站安全等级)
仅当你的全站所有接口都不需要CSRF防护时使用,打开Django项目的settings.py文件,找到MIDDLEWARE配置列表,注释掉django.middleware.csrf.CsrfViewMiddleware这一行即可。
额外注意事项
如果后续需要保留CSRF校验能力,可调整请求逻辑:
- Flutter端先发起一次GET请求,从返回的Cookie中取出
csrftoken值 - 后续发起POST请求时,在请求头中添加
X-CSRFToken字段,值为取出的csrftoken即可通过校验
内容的提问来源于stack exchange,提问作者Ómár Táhá
相关产品推荐
相关产品推荐

