[Python] [Django] [Django将post请求变成get的奇妙冒险]
通过requests库向Django后台服务器发送post请求,请求url如下
http://10.16.195.51:8000/hsvltnprjct/shutdown
请求方法如下
import requests
url = "http://10.16.195.51:8000/hsvltnprjct/shutdown"
data = {"task_id":"24123-234123-4124312"}
headers = {"Content-Type":"application/json"}
requests.post(url=url, headers=headers, data=data)
在服务端一直走get请求逻辑,于是我尝试通过中间件来判断,请求方式
在中间件最上方加一个中间件,打印request.META,发现会收到两个请求,一个post,一个get。
然后将中间件方法放在中间件最后,发现只会收到一个get请求。
说明django服务最开始确实收到了post请求,只不过在中间被重定向为get请求了。
查阅了一系列完整,发现了django的一个小细节,在url定向的时候,如果末尾不是‘/’,会被系统重定向到带‘/’的url,即301,然后空的请求被重定向,就变成了get。
比如本来是’/sudoku/‘结果我的目标是’/sudoku’,这就会出问题
如果还有问题的话 加上装饰器 @csrf_exempt
django中也有这一点的配置,APPEND_SLASH
django默认地会将APPEND_SLASH设置为True,也就是任何不匹配或尾部没有斜杠(/)的申请URL,将被重定向至尾部包含斜杠的相同字眼的URL。
当 seetings.py 设置为 APPEND_SLASH = False 时,访问 http://example.com/hello 将会返回 404。
所以我觉得还是按照官方默认开启这个参数方便些,如果不想要后面的 / ,可以在 urls.py 定义成 '^hello$' 这样的形式。