[Python自学] restframework (5) (解析器)

一、数据解析器

1.Django默认的数据解析

在我们使用django框架时,浏览器如果发送以下类型的POST数据:

Content-Type=application/x-www-form-urlencoded
Content-Type=application/form-data

则django会自动帮我们将请求体中的数据转换为字典,保存在request.POST中。

但是,如果浏览器发送的是json数据:

Content-Type=application/json

则django无法为我们转换,我们只能从request.body中获取原始数据,自己进行转换。

2.restframework提供的解析器

如果我们使用restframework,他给我们提供了几个常用的数据解析器,列表如下:

from rest_framework import parsers

# 处理json数据,media_type = 'application/json'
parsers.JSONParser
# 处理x-www-form-urlencoded数据,media_type = 'application/x-www-form-urlencoded'
parsers.FormParser
# 处理multipart/form-data数据,media_type = 'multipart/form-data'
parsers.MultiPartParser
# 处理所有数据,media_type = '*/*'
parsers.FileUploadParser

如果我们在视图类中不指定需要使用的解析器,则默认会使用三种:

在APIView类中可以看到:

class APIView(View):

    # The following policies may be set at either globally, or per-view.
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
    parser_classes = api_settings.DEFAULT_PARSER_CLASSES
    authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
    ...
    ...

在DEFAULTS中找到 DEFAULT_PARSER_CLASSES :

'DEFAULT_PARSER_CLASSES': [
    'rest_framework.parsers.JSONParser',
    'rest_framework.parsers.FormParser',
    'rest_framework.parsers.MultiPartParser'
],

默认使用了JSONParser、FormParser和MultiPartParser三种解析器。

3.在视图类中指定可以使用的解析器

class LoginView(APIView):
    authentication_classes = []
    parser_classes = [parsers.JSONParser,parsers.FormParser]
    ...
    ...

我们可以在视图类中使用parser_classes列表来指定该视图类可以使用的解析器。

当然,我们也可以仿造JSONParser等解析器实现自己的解析器。

66

猜你喜欢

转载自www.cnblogs.com/leokale-zz/p/12238449.html