使用 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.POSTrequest.FILES 属性 除了:

它包括所有已解析的内容,包括文件和非文件输入。 支持解析POST以外的HTTP方法的内容,即可以访问PUTPATCH的内容 要求。 支持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 框架的基于密钥的访问

Django REST Framework 只允许超级用户访问 api web 视图

如何使用 TemplateHTMLRenderer 在 Django-REST-Framework 中创建/放置?

你如何在 django rest 框架中实现 CSRF 令牌?