【DRF】POST 数据到 REST Framework 响应 415 {"detail":"Unsupported media type \"text/plain\" in request."}
使用 request/postman POST data 到 Django REST Framework 出现 415 Unsupported Media Type {“detail”:“Unsupported media type “text/plain” in request.”} 问题
Overview
Reason
响应的信息已经很明确了,415 Unsupported Media Type.
如果对 HTTP 的大部分 response statue code 熟悉的话,这个应该一下子能够反应过来为什么。
不过不巧,我只了解不到 10 个,这个 415 以前还没碰见过。
最快的解决方法永远不会是某度, Google 了一下:
然后在 stackoverflow 上看到最接近的提问 ???? ????
等宜于 Google 会分析网页内部的内容,所以这个 StackOverflow 的提问标题虽然和我搜索的 “完全” 不一样,但是 Google 还是把它放在了第一个,而它也确实是我想要的。
Answer:
这个回答下面还提到了 DRF 的 token 权限问题。
(当然,实际上你不能随便就 post 一个数据给公网的服务器上,还期望它会给你一个正确的响应,包括你自己放在公网的服务器上你肯定也不想这样子)但是我没有截图记录下来,因为这个问题我之前解决过了,
(因为目前我是在私网甚至是同主机上开发中,所以把权限验证取消掉了)
如果你会遇到类似 CSRF / token 的失败提示,那么我的 这篇博客 ????1 里取消权限验证的方法可能可以参考一下。在之后我肯定会更新公网 DRF 服务器适用的权限机制使用方式,或许我会记得到这篇博客里更新一下这部分内容。
Solution
Postman
从我给的截图 ???? 中可以看到,将 Text 改为 JSON 就可以了。
实际上如果你不是用 postman 的
raw
来post 的话,而是使用form-data
, 那么你会发现没有本文标题的问题。
requests 库
对于 requests 库的 post 使用,这里有一篇很多例子的文章 => Python requests.post() Examples ????
这是我用 requests 库 post 成功的一个例子:
我想,里面的重点已经划的很清楚了。
不过有三点值得一提的地方,以我上面截图 requests POST 的 data 为例,
其中:
-
id
是不要 post 的,虽然post 过去也不会生效也不会失败,但是这也是一个干扰。因为我是直接从 server response 的 post 成功的消息2中 copy 过来,因为这样省的我每次测试都要重新输入数据,所以不小心将
id
也 copy 了,运行的时候还没有注意到。 -
regitster_date
(是的,我的 model 拼写错误了) 是一个 datetime 的 model,POST 的格式正如你所看到的那样。
另外在另一篇文章中,我也截图记录了一下 datetime 的(默认?)“字符串”格式3:
所以你可以看到,date
用-
分割,date
和time
用T
分割,time
用:
分割! -
还有
signature
,location
这类字段,如果没有值,而 model 中有为其设定了 default 值。那么就不要用"signature": ""
;"location": ""
这种做法。这个将这类有默认值,并且 post 的时候不为其赋值的字段删除掉即可。
-
该链接带有锚,但是 **** 的文章锚会在每一次该篇文章内容编辑(更新)之后改变,这是没有锚的 链接 ???? <==进入== 转 6. Permission Issue 部分即可。 ↩︎
-
Django REST Framework 的 generics =>
as_view
会响应 POST(即 create) 后成功的该条 create 内容的 data,如果你是在用 DRF,并且手动在(比如)浏览器 POST 过的话,你应该知道我的意思。 ↩︎ -
datetime 在 Python 中是个
class
(这里没有在说 module 的那个datetime
),所以在 Python 的代码中操作基本是一个实例在操作,但是我们 POST 的时候又不可能 POST 一个 Python 实例过去(那会是一种什么神奇的情况),所以 datetime 的字符串格式应该是怎么样的还是很重要的(这是相对我们不自己处理这个 datetime 的字符串,而是完全交给框架来做的情况而言)。 ↩︎