python-django rest framework框架之解析器

摘要:
如果不获取请求主体数据,则不会调用解析器。

1.解析器 : 对请求的数据进行解析 - 请求体进行解析。 解析器在你不拿请求体数据时 不会调用。

class UsersView(APIView):
    def get(self,request,*args,**kwargs):

        return Response('...')

    def post(self,request,*args,**kwargs):
        # # application/json
        # print(request._request.body) # b"xxxxx"   decode()   json.loads
        # print(request._request.POST) # 无
        # 当post 请求的数据格式是application/json的时候, request._request.body有值,而request._request.POST并没有值
        # 我们要通过 decode + json.loads 来获取数据
        
        # # www-form-url-encode
        # print(request._request.body)
        # print(request._request.POST)
        # 当post 请求的数据格式是www-form-url-encode的时候,request._request.body和request._request.POST都有值
        
        
        # 而在我们用rest framework时往往发送的都是json格式的数据,那我们每次都要这么费事的转化吗,答案肯定不是
        # 可以设置     parser_classes
        
        from rest_framework.parsers import JSONParser,FormParser
        class UsersView(APIView):
            parser_classes = [JSONParser,FormParser]    #表示服务端可以解析的数据格式的种类。
            #如果客户端的Content-Type的值和 application/json 匹配:JSONParser处理数据
            #如果客户端的Content-Type的值和 application/x-www-form-urlencoded 匹配:FormParser处理数据
def get(self,request,*args,**kwargs): return Response('...') def post(self,request,*args,**kwargs): # request.data 就是 处理转化后的数据 {'name':'xxx','age':'12'} print(request.data)           print(request.FILES)
          print(request.POST)
          return Response('...')

     # 全局使用: 配置文件 一般都默认使用全局配置
        REST_FRAMEWORK = {
           'DEFAULT_PARSER_CLASSES':[
            'rest_framework.parsers.JSONParser',
            'rest_framework.parsers.FormParser',
           ]
        }
       

2.  print(request.data) 的 源码

class Request(object):
    @property
    def data(self):
        if not _hasattr(self, '_full_data'):
       #调用_load_data_and_files方法 self._load_data_and_files()
return self._full_data def _load_data_and_files(self): if not _hasattr(self, '_data'):
       #调用_parse方法 self._data, self._files
= self._parse() def _parse(self):
     #调用DefaultContentNegotiation类的select_parser方法,见下面 parser
= self.negotiator.select_parser(self, self.parsers) # 在封装Request的时候self.parser = 配置的解析类的对象列表 #self.negotiator = self._default_negotiator() = api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS() if not parser: #如果返回 None 说明不匹配,抛出异常 raise exceptions.UnsupportedMediaType(media_type) try: # 匹配成功, 相应的解析类对象调用parse方法 parsed = parser.parse(stream, media_type, self.parser_context) class DefaultContentNegotiation(BaseContentNegotiation): def select_parser(self, request, parsers): for parser in parsers: # 判断 解析类的对象和 请求的 content_type 是否匹配 if media_type_matches(parser.media_type, request.content_type): return parser return None 拿 JSONParser 举例 class JSONParser(BaseParser): media_type = 'application/json' renderer_class = renderers.JSONRenderer strict = api_settings.STRICT_JSON def parse(self, stream, media_type=None, parser_context=None): try: #和我们自己处理是一个原理 # 先decode decoded_stream = codecs.getreader(encoding)(stream) parse_constant = json.strict_constant if self.strict else None # 再load return json.load(decoded_stream, parse_constant=parse_constant) except ValueError as exc: raise ParseError('JSON parse error - %s' % six.text_type(exc))

免责声明:文章转载自《python-django rest framework框架之解析器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇net WebApi中使用swagger参考美团、饿了么 && localStorage下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ExtJS 4.2 教程-06:服务器代理(proxy)

在上一节我们介绍了客户端的几种代理,本节的主要内容是介绍如何使用服务器端代理,将重点介绍AjaxProxy,这是我们最常用的代理方式。 Ajax web应用程序开发过程中,与服务器端交互的技术最常用的就是Ajax了。Ajax 是使用Javascript创建一个HttpRequest,采用异步的方式从服务器获取数据。我们先看一个简单的示例: Ext.onR...

工单系统之用户模块整体实现

1 用户模块管理分析 1.1 管理模块部分功能展示 1.2 前端总体业务逻辑分析 Vue组件思想 vue本身就是一个组件,所以我们在使用的过程中,一定要有组件思想。本项目就是利用父子组件传值,调用方法来进行编写的。 1.2.1 Home页面 其中嵌套组件Header和LeftMenu 总页面,主要用于布局。用于显示左侧菜单和头部信息。其中嵌套子路由用于不...

Django:RestFramework之-------渲染器

12.渲染器 from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer,AdminRenderer class TestView(APIView): #BrowsableAPIRenderer页面渲染更加好看 #JSONRenderer 返回json数据...

推荐一个Visual Studio Code的rest插件

最近在把一些搜索功能往ElasticSearch上迁移,在学习ElasticSearch的功能时,发现当有大量rest脚本需要反复使用的时候,postman那种多tab页的方式用起来反而没有Kibana的哪种把命令放到一个页面的方式方便。但Kibana编写rest请求也不是很方便,往往是在vs code中写好请求,放到kibana中去执行的。 弄了一阵子后...

Django学习系列之django restframework

曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style)。所以我们的选择变得很简单:前端ajax访问后端的RESTful API对资源进行操作Django中有一些可选的REST framework,比如django-piston,django-tasypie。 但是我和google...

WordPress版微信小程序开发系列(一):WordPress REST API

自动我发布开源程序WordPress版微信小程序以来,很多WordPress站长在搭建微信小程序的过程中会碰到各种问题来咨询我,有些问题其实很简单,只要仔细看看我写的文章,就可以自己解决。不过这些文章里无法涵盖所有的技术点,因为涉及Wordpress和微信小程序两套程序系统,有些技术点对于小白用户来说确实有些难度,因此我考虑写一个系列文章介绍WordPre...