【问题标题】:Acessing POST field data without a form (REST api) using Django使用 Django 访问没有表单(REST api)的 POST 字段数据
【发布时间】: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 中的所有数据都已经有了

标签: python django rest post django-rest-framework


【解决方案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

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 1970-01-01
      • 2017-02-02
      • 2016-02-20
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多