drf之请求和响应

drf之请求和响应

drf请求

在APIView视图类中,会在执行as_view方法时重新包装request,而用到的方法时通过rest_frame.request.Request类产生了一个新的request对象。

这段代码如下:

return Request(
	request,
	parsers=self.get_parsers(),
	authenticators=self.get_authenticators(),
	negotiator=self.get_content_negotiator(),
	parser_context=self.get_parser_context(request)
)

那么Request有什么方法属性和方法呢?

Request对象属性方法

上述得到新request对象时,老request会被传入,同时还传入了四个额外的参数,新request的所有新属性都是基于这5个参数展开的。

request初始化:

def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
    ...
    self._request = request  # 保存老request
    self.parsers = parsers or ()
    self.authenticators = authenticators or ()
    self.negotiator = negotiator or self._default_negotiator()
    self.parser_context = parser_context
    ...
  • _request:老request存在这个属性中。

  • __getattr__:这个类方法中让新request拿不到属性时从老request中取

    def __getattr__(self, attr):
        try:
            # 一旦取不到,就去老request中取
            return getattr(self._request, attr)
        except AttributeError:
            return self.__getattribute__(attr)
    
  • data:处理好的body携带的数据,以字典或querydict存储

  • query_params:携带在路由后的数据会被处理成字典存放在这个字典中

  • user/auth:认证功能和属性包装在一块,第一次取时会认证,再次取会直接取用户

    这个会在三大认证源码解析中详细讲解

配置drf解析body数据方式

如果要求接口只接收json格式数据,其他格式数据不接收,那么可以在局部或者全局配置。

  1. 局部配置

    # 视图类中配置parser_classes
    class BookView(APIView):
        parser_classes = [JSONParser,]
    
  2. 全局配置

    # 在项目settings中配置
    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': [
            # 'rest_framework.parsers.JSONParser',
            'rest_framework.parsers.FormParser',
            # 'rest_framework.parsers.MultiPartParser',
        ],
    

    ps:很多配置可以参考rest_framework.views.DEFAULTS,如果没有局部或全局设置,则会按照这里的DEFAULTS配置

  3. 局部和全局配置掺和

    局部的配置要优先于全局,如全局三种解析都配置了,而局部的视图类只配置一种,则那个视图类只接收一种格式的数据,其他视图类都接收三种。

drf响应

Response对象属性方法

__init__方法:

形参 数据
data 字典或列表,可以是序列化类序列化好的
status 响应状态码
template_name 修改响应模板的样子
headers 响应头
content_type 响应编码格式,一般不动
exception 异常

Response能够响应的编码格式

一般不需要动,有两种,一个是加了一点html代码的浏览器样式,一个就是json格式响应。

drf已经让这两种响应格式根据浏览器访问或非浏览器访问自动响应对应的格式了。

当然想配置则也可以在视图类中局部配置或者settings中全局配置。

# 方式一:在视图类中写(局部配置)
	-两个响应类---》找---》drf的配置文件中找--》两个类
    -from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
    class BookView(APIView):
    	renderer_classes=[JSONRenderer,]

# 方式二:在项目配置文件中写(全局配置)
    REST_FRAMEWORK = {
      'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
}
posted @ 2023-02-08 21:35  leethon  阅读(15)  评论(0编辑  收藏  举报