使用 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 字段数据的主要内容,如果未能解决你的问题,请参考以下文章