使用 Django 访问没有表单(REST api)的 POST 字段数据
Posted
技术标签:
【中文标题】使用 Django 访问没有表单(REST api)的 POST 字段数据【英文标题】:Acessing POST field data without a form (REST api) using Django 【发布时间】:2016-03-19 02:46:51 【问题描述】:在django documentation 中,它说:
HttpRequest.POST
一个类似字典的对象,包含所有给定的 HTTP POST 参数,前提是请求包含表单数据。请参阅下面的 QueryDict 文档。如果您需要访问请求中发布的原始数据或非表单数据,请改为通过 HttpRequest.body 属性访问。
但是,服务器不响应浏览器(例如使用 JS 框架或表单),而是响应 Anroid/ios 应用程序发送的 REST api。
如果客户端直接在 POST 请求中发送字段,我该如何读取数据?例如,这个(Java + Unirest):
Unirest.post("/path/to/server")
.field("field1", "value2")
.field("field2", "value2");
编辑:我可以简单地使用response.POST["field1"]
读取数据,还是我必须使用request.body
做一些事情?
编辑 2: 所以我可以简单地将request.body
用作类似于request.POST
的类字典对象?
【问题讨论】:
request.body 中的所有数据都已经有了 【参考方案1】:据我了解 Unirest 的字段方法只使用普通的application/x-www-form-urlencoded
数据,如 html 表单。所以你应该可以像你建议的那样使用response.POST["field1"]
。
【讨论】:
【参考方案2】:来自docs:
它包括所有已解析的内容,包括文件和非文件输入。 支持解析
request.data
返回请求正文的解析内容。这是 类似于标准的request.POST
和request.FILES
属性 除了:POST
以外的HTTP方法的内容,即可以访问PUT
和PATCH
的内容 要求。 支持REST框架灵活的请求解析,而不仅仅是支持表单数据。例如,您可以处理传入的JSON
数据的方式与处理传入表单数据的方式相同。
我可以简单地使用
response.POST["field1"]
读取数据吗? 必须与request.body
做点什么?所以我可以简单地将
request.body
用作类似字典的对象 到request.POST
?
一个例子 - 来自 create
方法(视图集):
user = dict(
full_name=request.DATA['full_name'],
password=request.DATA['password'],
email=request.DATA['email'],
personal_number=request.DATA['personal_number'],
user_type=request.DATA['user_type'],
profile_id=request.DATA['profile_id'],
account_id=request.DATA['account_id']
)
编辑 1:在版本 3(最新)中 - request.DATA
已替换为 request.data
:
user = dict(
full_name=request.data['full_name'],
password=request.data['password'],
email=request.data['email'],
personal_number=request.data['personal_number'],
user_type=request.data['user_type'],
profile_id=request.data['profile_id'],
account_id=request.data['account_id']
)
【讨论】:
request.DATA
在新版本中已弃用,并替换为 request.data
感谢指出,我没有接触到最新版本 3 - 使用 2.3.13【参考方案3】:
如果您正在与之交互的 api 是一个基于 Django 类的简单视图,您可以通过 request.body
访问数据,如下所示:
class MyView(View):
def post(self, request):
field1 = request.body.get('field1')
field2 = request.body.get('field2')
... # processing here
如果你使用的是 Django rest framework api,你可以通过request.data
访问数据:
field1 = request.data.get('field1')
field2 = request.data.get('field2')
注意:如果您发现 request.DATA
在 Internet 的某个地方使用也是正确的,但它仅对旧版本的 DRF 有效,并且在较新的版本中不推荐使用 request.data
。
【讨论】:
以上是关于使用 Django 访问没有表单(REST api)的 POST 字段数据的主要内容,如果未能解决你的问题,请参考以下文章
JS 框架能够基于(django)rest api 选项生成表单
使用 Axios 从前端访问 Django Rest API 时出现 Cors 错误
Django REST Framework 只允许超级用户访问 api web 视图