zoukankan      html  css  js  c++  java
  • DRF之请求与响应

    一、Request

    在Rest Framework 传入视图的request对象已经不再是Django默认的HTTPResponse对象了,而是Rest Framework提供的Request类的对象了。

    但是Request会在接受到请求后会自动根据Content-type的数据类型进行解析为[QueryDict]对象,也就是说它会自动根据前端发送的数据格式进行解析。

    源码分析

    # from rest_framework.request import Request
    
    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        # 先判断传入的request是不是原生的HttpResponse的对象,为了避免套娃
        assert isinstance(request, HttpRequest), (
            .format(request.__class__.__module__, request.__class__.__name__)
        )
    	# 二次封装request,将原生request作为drf request对象的 _request 属性
        self._request = request
        
        
    # 点拦截,当新request.的时候触发
    def __getattr__(self, attr):
        try:
            return getattr(self._request, attr)	# 通过反射,获取原生request对象,取出属性或方法
        except AttributeError:
            return self.__getattribute__(attr)
    

    常用属性

    request.data:返回解析后的请求体数据,不仅支持表单类型数据,也支持JSON数据

    request.query_params:和Django原生的request.GET相同,名字不一样而已

    @property
    def query_params(self):
        return self._request.GET	# 还是原来那个
    

    二、Response

    这是Rest Framework提供的响应类,它会把数据内容转换成符合前端的数据类型,它是根据请求头中的Accept来自动转换响应数据到对应格式。没有的话就是默认的,可以通过以下配置:

    REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES': (  				# 默认响应渲染类
            'rest_framework.renderers.JSONRenderer',  			# json渲染器
            'rest_framework.renderers.BrowsableAPIRenderer',  	# 浏览API渲染器
        )
    }
    

    参数说明

    # from rest_framework.response import Response
    
    def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
    

    data:返回要被序列化的数据,字典

    status:状态码,默认200

    template:模板名称,可以自定义模版

    headers:响应头,可以往响应头放东西,就是一个字典

    content_type:响应的编码格式,(application/json或text/html)

    常用属性

    .data:传给response对象序列化后没有render的数据

    .status_code:状态码

    .content:render后的响应数据

    学习之旅
  • 相关阅读:
    button 垂直分布
    GitHub上值得关注的iOS开源项目
    电脑连接网络(网络正常),但不能上网,登录网页提示dns_probe_finished_no_internet
    android 模拟应用因内存不足被后台杀死命令
    android 屏幕划分
    android 没有root的手机导出数据库
    移动硬盘不能识别,设备管理器中显示黄色感叹号
    低功耗蓝牙开发(BLE)
    音视频学习笔记
    Java中为什么要使用线程池?如何使用?
  • 原文地址:https://www.cnblogs.com/XiaoYang-sir/p/14974204.html
Copyright © 2011-2022 走看看