zoukankan      html  css  js  c++  java
  • DAY 67 drf05

    1 序列化器源码
    -many参数控制,在__new__中控制了对象的生成
       -局部和全局钩子源码:is_valid--》找self.方法一定要从根上找
       -source参数是如何执行的:‘publish.name’,'方法'

    2 视图:
    -2个视图基类
       -5个视图扩展类
       -9个视图子类
       -视图集
      -ViewSetMixin
           -ViewSet, GenericViewSet
           -ModelViewSet, ReadOnlyModelViewSet
       
    3 视图类的继承原则
    -如果不涉及数据库操作:继承APIView
       -如果想让路由可以映射:继承ViewSetMixin
       -如果不涉及数据库操作,又要让路由可以映射:继承ViewSet
       -比如发邮件接口,发短信接口
       
       
       -如果涉及到数据库操作:继承GenericAPIView
       -如果想让路由可以映射:继承ViewSetMixin
       -如果涉及数据库操作,又要让路由可以映射:继承GenericViewSet
       -如果涉及数据库操作,又要让路由可以映射,还要能新增:继承GenericViewSet+CreateModelMixin或者继承ViewSetMixin+CreateAPIView
       
       -如果只涉及到数据库操作和新增:继承CreateAPIView
       
       -路由有映射,数据库操作,3个接口(查一个,删一个改一个)
       
    4 ViewSetMixin:路由的写法就特殊了
       
       
       
    5 类实例化,先执行了元类的__call__:调用了这个类的__new__,生成一个空对象,调用了类的__init__,完成了对象的初始化
    6 对象()---->会触发类的 __call__
    7 类()----->会触发类的类(元类)的__call__


    1 drf 响应格式和请求格式配置(了解)

    1.1 配置响应格式

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

    2 在浏览器访问就是浏览器方式,用postman访问就是json格式,ajax请求就是json格式


    3 原来没有配置,为什么显示浏览器方式和json的样子
    4 drf也有一套默认配置文件,默认就配了两个响应类

    5 局部配置某个视图类的响应格式,在视图类中配置
    renderer_classes = []

     

    1.2 配置能够解析的格式(urlencoded,formdata,json)

    1 在setting中配置
    REST_FRAMEWORK = {
       'DEFAULT_PARSER_CLASSES': [
           'rest_framework.parsers.JSONParser',
           'rest_framework.parsers.FormParser',
           'rest_framework.parsers.MultiPartParser'
      ]
    }
    2 它就只能解析三种请求编码格式(urlencoded,formdata,json)

    3 局部使用,在视图类中配置
    parser_classes = [FormParser]

     

     

    2 封装自己的Response对象

     

    2.1 low版本

    封装

    class MyResponse():
       def __init__(self):
           self.status = 100
           self.msg = None
       @property
       def get_dict(self):
           return self.__dict__

    使用

    #### 原来的写法
    # class Test(APIView):
    #     def get(self,request):
    #         response={'status':'100','msg':None}
    #         #写一堆逻辑
    #         response['data']={'name':'lqz','age':19}
    #         response.data={}
    #
    #         return Response(response)

    ###自己封装了low   response后
    from app01.response import MyResponse
    class Test(APIView):
       def get(self, request):
           response = MyResponse()
           # 写一堆逻辑
           response.status=101
           response.msg='失败了'
           response.data={'name': 'lqz', 'age': 19}

           return Response(response.get_dict)

    2.2 高级版本

    class APIResponse(Response):
       def __init__(self, code=100, msg=None, data=None, status=None,
                    template_name=None, headers=None,
                    exception=False, content_type=None, **kwargs):
           dic = {'status': code, 'msg': msg}
           if data:
               dic['data'] = data
           if kwargs:
               dic.update(kwargs)

           super().__init__(data=dic, status=status,
                            template_name=template_name, headers=headers,
                            exception=exception, content_type=content_type)

           
    ### 使用,在视图类中
    return APIResponse(msg='成功了',data={'name': 'lqz', 'age': 19},next=9)

     

    3 drf自动生成路由

    1 三种路由写法
    - path('test/', views.Test.as_view()),
       -path('test/', views.Test.as_view({'get':'send_email'})),
       -自动生成路由
    # 1 导入路由类
    from rest_framework.routers import SimpleRouter, DefaultRouter
    # DefaultRouter生成的路由更多一点,多了一个根的路由(没有用)
    # 2 实例化得到对象
    router = SimpleRouter()
    # 3 注册路由

    router.register('books', views.BookView)
    # router.register('publish', views.PublishView)

    # print(router.urls) # 自动生成的路由
    urlpatterns = [
       # 4 把自动生成的路径加入到urlpatterns
       path('api/v1/', include(router.urls)),
       # path('api/v2', include(router.urls))
       # path('admin/', admin.site.urls),
       # path('test/', views.Test.as_view()),
       # path('books/', views.BookView.as_view({'get': 'list', 'post': 'create'})),
       # path('books/<int:pk>', views.BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
    ]
    # 4 把自动生成的路径加入到urlpatterns
    # urlpatterns+=router.urls

    # a=[1,2,3]
    # b=[4,5,6]
    # print(a+b)

    重点

    总结:ViewSetMixin+9个视图字类才能用自动生成路由

     

    4 action装饰器

    1 作用:给自动生成路由的视图类再定制一些路由
    2 用法一:
    # api/v1/books/sen_email/
    @action(methods=['GET'], detail=False)
    def sen_email(self, request, *args, **kwargs):
    print(args)
    print(kwargs)
    return APIResponse(msg='发送成功')

    3 方法二:
    # api/v1/books/1011/sen_email/
    @action(methods=['GET'], detail=True)
    def sen_email(self, request, *args, **kwargs):
    # pk=1011
    print(args)
    print(kwargs)
    return APIResponse(msg='发送成功')

     

    5 认证介绍和源码分析

    1 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件


    2 APIVIew--->dispatche--->self.initial--->写的
    self.perform_authentication(request)# 认证
    self.check_permissions(request) # 权限
    self.check_throttles(request) # 频率

    3 APIView的perform_authentication
    -request.user # 新的request对象,drf的Request类

    4 Request类的user
    -被包装成了数据属性,内部有 self._authenticate()
    -Request类的_authenticate()方法


    5 Request类的_authenticate()方法
    def _authenticate(self):
    for authenticator in self.authenticators:
    try:
    user_auth_tuple = authenticator.authenticate(self)
    except exceptions.APIException:
    self._not_authenticated()
    raise

    if user_auth_tuple is not None:
    self._authenticator = authenticator
    self.user, self.auth = user_auth_tuple
    return

    self._not_authenticated()

    6 drf的Request对象实例化是再什么时候?
    -再APIVIew的dispatch最上面完成的
    - return Request(
    request,
    parsers=self.get_parsers(),
    authenticators=self.get_authenticators(), # 看它
    negotiator=self.get_content_negotiator(),
    parser_context=parser_context
    )
    7 APIView的get_authenticators
    def get_authenticators(self):
    return [auth() for auth in self.authentication_classes]
    -如果我再视图类中写:authentication_classes=[类名,类名1]
    -返回[对象,对象1]
  • 相关阅读:
    编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
    Java基础——数据类型之间的转换
    Spring 事物机制总结
    Spring 3.0 注解注入详解
    Spring 注解 @Resource和@Autowired
    从jsp向servlet传送数据的两种方式
    文本输入框,只能显示内容而不能修改
    myeclipse 中项目名出现红色感叹号解决方法
    在servlet中使用split()截取以反斜杠‘’分割的字符串
    jsp页面跳转方式
  • 原文地址:https://www.cnblogs.com/DEJAVU888/p/14893760.html
Copyright © 2011-2022 走看看