使用Django在没有表单(REST api)的情况下访问POST字段数据

nul*_*ull 16 python django rest post django-rest-framework

django文档中,它说:

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");
Run Code Online (Sandbox Code Playgroud)

编辑:我可以简单地使用数据读取数据response.POST["field1"],还是必须执行某些操作request.body

编辑2:所以我可以简单地request.body用作类似字典的对象request.POST

小智 8

据我所知,Unirest的字段方法只使用普通application/x-www-form-urlencoded数据,如HTML表单.所以你应该能够response.POST["field1"]像你建议的那样使用.


Nab*_*med 5

文档

request.data返回请求正文的解析内容。这类似于标准request.POSTrequest.FILES属性,除了:

  • 它包括所有已解析的内容,包括文件和非文件输入。
  • 它支持解析除以外的HTTP方法的内容POST,这意味着您可以访问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']
            )
Run Code Online (Sandbox Code Playgroud)

编辑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']
                )
Run Code Online (Sandbox Code Playgroud)

  • 在新版本中不推荐使用`request.DATA`并由`request.data`代替 (2认同)

Dhi*_*aTN 5

如果你正在与之交互的api是一个基于Django类的sipmle视图,你可以通过以下方式访问数据request.body:

class MyView(View):
    def post(self, request):
        field1 = request.body.get('field1')
        field2 = request.body.get('field2')
        ... # processing here
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Django rest framework api,则可以通过request.data以下方式访问数据:

field1 = request.data.get('field1')
field2 = request.data.get('field2')
Run Code Online (Sandbox Code Playgroud)

注意:如果你发现request.DATA在互联网上的某个地方使用也是正确的,但它只对旧版本的DRF有效,并且request.data在新版本中不赞成使用它.