如何从外部应用向Django发送POST请求并解决CSRF验证问题
解决方案
问题原因
Django默认启用了CSRF防护中间件,所有POST请求默认需要携带合法的CSRF Token才能通过验证,你的请求没有携带对应令牌所以被拦截。
方案1:接口仅服务于内部脚本,直接关闭CSRF验证(最简单)
给你的check视图加csrf_exempt装饰器跳过CSRF校验即可:
# 先导入装饰器 from django.views.decorators.csrf import csrf_exempt from django.http import HttpResponse # 加在视图函数上方 @csrf_exempt def check(request): message = '' # 注意你原代码的判断条件写错了,你传的参数没有名为login/password的键,永远无法命中 if 'login' in request.POST and 'pass' in request.POST: checkdata(request.POST) else: message = '404' return HttpResponse(message)
改完之后你的原有post.py代码就可以正常请求了。
方案2:正常获取CSRF Token发起请求
如果需要保留CSRF防护,就通过会话先获取令牌再发起POST请求,修改你的post.py代码如下:
import requests # 用Session保持会话,自动管理Cookie session = requests.Session() # 先发起一次GET请求获取CSRF Cookie,地址可以是你的check接口或者任意返回CSRF令牌的Django页面 session.get('http://127.0.0.1:8000/check') # 从Cookie中取出CSRF Token csrf_token = session.cookies.get('csrftoken') param_tuples = [('login', 'value1'), ('pass', 'value2')] # POST请求头带上X-CSRFToken字段 response = session.post( 'http://127.0.0.1:8000/check', data=param_tuples, headers={'X-CSRFToken': csrf_token} )
内容的提问来源于stack exchange,提问作者Win
相关产品推荐
相关产品推荐

