前言:在做项目时,使用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'})),
]