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

时间:2015-12-13 16:11:58

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

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

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分: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

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

field1 = request.data.get('field1')
field2 = request.data.get('field2')

NB:如果您发现在互联网上某处使用的request.DATA也是正确的,但它仅适用于旧版本的DRF,并且已弃用request.data较新的版本。

答案 2 :(得分:4)

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