对Django的Delete请求被重定向到GET请求

前言:在做项目时,使用postman测试接口,url少了一个/,执行的是Delete请求,收到的却是GET请求的结果,加上/会正常响应。BUG很简单解决了,但是比较好奇为什么会被重定向。

控制台显示

INFO basehttp 124 "DELETE /essential/voltage HTTP/1.1" 301 0
INFO basehttp 124 "GET /essential/voltage/ HTTP/1.1" 200 237

可以看到请求自动进行了重定向。一开始以为是路由的问题,后来看了一圈源码也没找到相关代码。
然后去找了Django的官方文档,直接搜索redirect,后来在找settings到一个APPEND_SLASH属性,默认为True.
下面是官方文档介绍

APPEND_SLASH
Default: True

When set to True, if the request URL does not match any of the patterns in the URLconf and it doesn't end in a slash, an HTTP redirect is issued to the same URL with a slash appended. Note that the redirect may cause any data submitted in a POST request to be lost.

The APPEND_SLASH setting is only used if CommonMiddleware is installed (see 中间件). See also PREPEND_WWW.

所以就是这个属性进行的重定向,当你请求地址匹配不到时,并且地址不以/结尾,就会被重定向到你这个地址的GET请求,并且会自动添加/。

看到这我就想吐槽一下,你这直接加个/就行了,为什么还要做重定向呢!想不到应用场景。




另外提一下另一个问题:DRF框架的路由,当DELETE请求不是携带的路径参数,就会报以下错误:

"方法 “DELETE” 不被允许。"

因为Django REST Framework需要知道您要删除的对象,但是无法仅从列表视图中检索此信息。
可以将router

router = routers.SimpleRouter()
router.register(r'voltage', views.Voltage, base_name='电压')

urlpatterns = [
      url(r'^', include(router.urls)),
]

换成

urlpatterns = [
      url(r'^voltage/$', views.Voltage.as_view({'get': 'list', 'post': 'create', 'put': 'update', 'delete': 'destory'})),
]

你可能感兴趣的:(对Django的Delete请求被重定向到GET请求)