[Python] [Django] Django将post请求变成get

[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$' 这样的形式。

原文地址:https://www.cnblogs.com/ryxiong-blog/p/12506955.html