zoukankan      html  css  js  c++  java
  • Django-rest-framework --- 五大模块

    Django-rest-framework模块

    drf配置使用

    1.先导入Django-rest-framework

    pip install djangorestframework
    

    2.使用的时候直接导入

    import rest_framework
    

    3.一定要在settings中进行注册,在INSTALLED_APPS进行注册,用到了反射,

    INSTALLED_APPS = ['rest_framework']
    

    常用的drf模块

    # 视图
    from rest_framework.views import APIView
    # 请求
    from rest_framework.request import Request
    # 响应
    from rest_framework.response import Response
    # 错误
    from rest_framework.exceptions import APIException
    # 分页
    from rest_framework.pagination import PageNumberPagination
    # 设置
    from rest_framework.settings import APISettings
    # json
    from rest_framework.parsers import JSONParser
    # 筛选
    from rest_framework.filters import OrderingFilter
    

    基于APIView类的请求生命周期

    1.APIView类继承View类,重写了as_view和dispatch方法

    2.重写的as_view方法,主体还是as_view方法,只是返回了视图view函数地址时,局部禁用csrf认证

    3.重写的dispatch方法

    在执行请求逻辑前,新增加了请求模块(二次封装request),解析模块(三种数据包格式的数据解析)

    在执行请求逻辑中,新增加了异常模块(执行出现任何异常交给异常模块处理)

    在执行请求逻辑后,新增加了响应模块(二次封装request),渲染模块(响应的数据能json和页面两种渲染)

    APIView与View对比

    在APIView情况下,csrf是没有起作用的,而在View情况下是可以起作用的

    因为在django项目启动的时候,先会将项目中的所有项目都加载一遍,会将url中的 as_view() 执行,返回一个结果,在继承APIView的情况下,返回的是 csrf_exempt(view) ,对此django的解释是如下,所以也就是不在接收csrf的验证;

    # Note: session based authentication is explicitly CSRF validated,
    # all other authentication is CSRF exempt.
    

    而View的返回是 view ,返回了一个方法,可以直接通过之后的请求来对此方法进行调用。

    请求模块

    request对象

    1.将wsgi的request对象转化成drf的Request类的对象,调用drf中的request类

    2.封装后的request对象完全兼容wsgi的request对象,并且将原request保存在新request._request

    3.重新格式化请求数据存放位置

    拼接参数:request.query_params(GET数据)

    数据包参数:request.data

    源码分析

    请求模块入口:

    APIView的dispatch方法的request = self.initialize_request(request,*args,**kwargs)
    
    request._request.method  在内部将wsgi的request复制给request._request
    request.method   就是通过__getattr__走的是request._requestmethod
    request.query_params   走的是方法属性,就是给request._request.GET重命名
    request.data    走的是方法属性,值依赖于request._full_data
    

    parsers:解析器,在DRF中,解析器是一个类列表,当每次接收到请求时DRF会根据请求头中的Content-type来指定使用哪种解析方法去解析数据,当content-type与解析器列表均不匹配的时候,则会解析失败

    isinstance:判断一个对象是否是一个已知类型,第一个参数为对象,第二个参数为类型,其返回值为布尔类型。

    解析模块

    解析模块只处理数据包参数 -- form-data,urlencoded,json

    1.全局配置所有视图类的解析方法,解析配置可以配置三种

    2.局部配置当前视图类的解析方法,解析配置可以配置三种

    3.配置的查找顺序:局部(视图类的属性) =》 全局(settings文件的drf配置)=》 默认(drf的默认配置)

    注:解析模块了解,但是全局配置和局部配置是重点

    全局settings配置查找的路径:

    D:PythonPythonLibsite-packages
    est_frameworksettings.pyAPISettings.py
    

    全局配置

    # drf框架自定义配置
    REST_FRAMEWORK = {
            'DEFAULT_PARSER_CLASSES': [
                # 全局配置解析类:适用于所有视图类
                'rest_framework.parsers.JSONParser',
                'rest_framework.parsers.FormParser',
                'rest_framework.parsers.MultiPartParser'
            ],
    }
    
    

    局部配置

    from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
    
    # 局部配置解析类:只适用当前视图类
    parser_classes = [JSONParser, FormParser, MultiPartParser]
    
    

    响应模块

    绑定一个页面可以返回一个页面

    data:响应数据

    status:响应的网路状态码

    template_name:drf完成前后台不分离返回页面,但是就不可以返回data(不需要了解)

    headers:响应头,一般不规定,走默认

    exception:一般异常响应,会将其设置为True,默认False(不设置也没事)

    content_type:默认就是application/json,不需要处理

    异常模块

    系统默认的只能处理客户端异常,不能处理系统异常

    当项目执行过程中发生异常的时候,会有报错信息提示出,可以根据自己的需求进行更改

    1.自定义异常处理函数:客户端异常还是交给drf自己处理,如果处理结果为空代表服务器异常,再手动处理,不管哪种处理都要记录到日志文件

    2.settings中配置执行自定义异常处理函数

    settings中进行配置

    # drf框架自定义配置
    REST_FRAMEWORK = {
        # 异常模块:异常处理函数
        'EXCEPTION_HANDLER': 'api.exception.exception_handler',   # v是自定义报错响应地址
    }
    
    
    

    新建一个py文件,防止响应错误信息的方法 --- exception.py

    # 一定要在settings文件中将异常模块配置自己的异常处理函数
    from rest_framework.views import exception_handler as drf_exception_handler
    from rest_framework.response import Response
    
    def exception_handler(exc, context):
        response = drf_exception_handler(exc, context)
        detail = '%s - %s - %s' % (context.get('view'), context.get('request').method, exc)
        if not response:  # 服务端错误
            response =  Response({'detail': detail})
        else:
            response.data = {'detail': detail}
    
        # 核心:要将response.data.get('detail')信息记录到日志文件
        # logger.waring(response.data.get('detail'))
    
        return response
    
    
    

    渲染模块

    浏览器和Postman请求结果渲染数据方式不一样,Postman请求结果是json,浏览器请求结果是页面

    全局配置查找路径

    D:PythonPythonLibsite-packages
    est_frameworksettings.pyAPISettings.py
    
    

    全局配置

    # drf框架自定义配置
    REST_FRAMEWORK = {
        # 全局配置渲染类:适用于所有视图类
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            # 'rest_framework.renderers.BrowsableAPIRenderer',  # 上线后尽量关闭
        ],
    }
    
    

    局部配置

    from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
    
    # 局部配置渲染类:只适用当前视图类
    renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
    
    
  • 相关阅读:
    Android Studio无法预览xml布局之解决方法(两种)
    ssm web.xml配置解析
    ssm框架下实现文件上传
    spring mvc使用@InitBinder 标签对表单数据绑定
    Jquery实现相对浏览器位置固定、悬浮
    asp,php,jsp 不缓存网页的办法
    Spring 2.5
    ERROR 1366 (HY000): Incorrect string value: 'xB3xA4xC9xB3' for column
    DELPHI SOKET 编程--使用TServerSocket和TClientSocket
    SVN switch 用法总结
  • 原文地址:https://www.cnblogs.com/whkzm/p/12094709.html
Copyright © 2011-2022 走看看