使用Django访问POST字段数据(REST API)而无需表单

17
Django文档中写道:

HttpRequest.POST

类似字典的对象,包含所有给定的HTTP POST参数,前提是请求包含表单数据。请参阅下面的QueryDict文档。如果您需要访问请求中发布的原始或非表单数据,请通过HttpRequest.body属性进行访问。

然而,服务器不会响应浏览器(例如使用JS框架或表单),而是由Android / 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 的字典对象吗?


您在请求体中拥有所有数据。 - utkbansal
3个回答

8
据我所了解,Unirest 中的 field 方法只是使用普通的 application/x-www-form-urlencoded 数据,就像 HTML 表单一样。因此,您应该可以像您建议的那样使用 response.POST["field1"]

6

根据文档

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']
                )

2
request.DATA在新版本中已经被弃用,应该使用request.data代替。 - Dhia
谢谢指出,我还没有接触过最新的版本3 - 我正在使用2.3.13。 - Nabeel Ahmed

6

如果你正在和一个简单的基于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的内容,那也是正确的,但这只适用于旧版本的DRF,在较新版本中已被弃用,建议使用request.data


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接