zoukankan      html  css  js  c++  java
  • cbv、resful、APIView和序列化组件

    CBV的源码分析

      -Class Base View(基于类的视图)

      -Function Base View( 基于函数的视图)

      -def as_view 类方法

      -def view:类方法内部,闭包函数定义:内层函数包含对外部作用域的引用

      -python中一切皆对象:函数也是对象

      -hasattr(self, 'get')--判断self类中是不是有该(get)方法

      -反射 setattr(self,get,get_all):相当于把get函数,变成了get_all

       -getattr(self, 'get'):拿到get函数的内存地址

    - def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            self.request = request
            self.args = args
            self.kwargs = kwargs
            #执行:dispatch:谁的dispatch方法?写的cbv的那个c,视图中的那个视图类
            #我这个类如果没有写dispatch,会执行View中的dispatch方法
            return self.dispatch(request, *args, **kwargs)
    -def dispatch(self, request, *args, **kwargs):
            #request.method 前台请求的方法,转成了小写
            #http_method_names View中定义的一个列表:是一堆请求方式
            if request.method.lower() in self.http_method_names:
                #getattr的第三个参数是默认值:self.http_method_not_allowed
                #拿到get方法的内存地址
                handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed
            #get(request,*args, **kwargs)
            return handler(request, *args, **kwargs)
            
        总结:*******请求来了--->as_view---->view---->dispatch--->分发到不同的函数,执行函数,拿到结果,然后返回
        

    1、1 阅读源码:
      左侧工具栏----》设置图标---->点击-----》show menbers(能看到py文件,类的方法)

    2 resful规范(是什么)
        -什么是resful(定义)
            -是一个规范
            -面向资源编程:把网络中所有东西,想象成资源
        -规范:
            -10条规范
            -API与用户的通信协议,总是使用HTTPs协议:https比http安全
            -域名 
                https://api.example.com  尽量将API部署在专用域名(会存在跨域问题)
                https://example.org/api/  API很简单
                例如写一个查询所有图书的api接口:https://api.example.com/books
                                                https://127.0.0.1/api/books
            -版本:每个接口都应该有版本
                URL,如:https://api.example.com/v1/    https://127.0.0.1/api/v2/books(推荐用这种)
                请求头 跨域时,引发发送多次请求
            -路径,视网络上任何东西都是资源,均使用名词表示(可复数)
                https://api.example.com/v1/books
                https://api.example.com/v1/animals
                https://api.example.com/v1/employees
                不能这么写:
                    -获取所有图书:https://127.0.0.1/api/get_all_books
                    -新增一本书:https://127.0.0.1/api/add_book
                同一都用这个:
                https://api.example.com/v1/books
            -method
                GET      :从服务器取出资源(一项或多项)
                POST    :在服务器新建一个资源
                PUT      :在服务器更新资源(客户端提供改变后的完整资源)
                PATCH  :在服务器更新资源(客户端提供改变的属性)
                DELETE :从服务器删除资源
            -过滤,通过在url上传参的形式传递搜索条件
                https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
            -状态码
                请求回去,需要有状态码
                自定义状态码
                status: 100表示成功
                        101表示用户名密码错误
                        102我也不知道什么错误
            -错误处理,应返回错误信息,error当做key。
                -{status:100,error:'错误信息写上'}
            -返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。
                GET /books:返回资源对象的列表(数组)
                GET /books/1:返回单个资源对象
                POST /books:返回新生成的资源对象    -新增,传数据,一旦新增完成,把新的资源对象返回
                PUT /books/1:返回完整的资源对象
                PATCH /books/1:返回完整的资源对象
                DELETE /books/1:返回一个空文档
            -Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API              方法,使得用户不查文档,也知道下一步应该做什么。
                    {
                        status:100
                        msg:成功
                        url:127.0.0.1/books/1
                    }
                核心:返回结果中提供链接
    2.1 django写resful规范的接口
    2.2 postman软件:模拟发请求的软件
    2.3 格式化json格式数据
        -https://www.json.cn/
    2.4 put请求,django不会帮我解析body内的数据,需要自己处理
                
    3 drf(django rest framework)框架(django的app)
        安装:djangorestframework
        -它是一个app,要在咱的项目中用
        -只是快速的构建resful规范的接口
        -csrf_exempt:局部禁用csrf(csrf是可以局部使用,局部禁用)
        -以后再执行的dispatch方法是APIView的dispatch方法
        -getattr和setattr
        -重点掌握这三点:
            -request.data 是个方法,包装成了属性,前台传过来body体中数据的数据,放在里面
            -request.query_params  这个是原来GET中的数据
            -request把原来的request包装进去了
    4 APIView源码分析
        
    5 序列化
        -1 自己写for循环来处理(麻烦)
        -2 django提供的序列化组件(不可控)
            from django.core import serializers
            ret=serializers.serialize('json','queryset对象')
            ret就是序列化之后的字符串了,不需要再序列化了
        -3 drf给咱提供的序列化组件
            -1 先导入
                from rest_framework.serializers import Serializer
                from rest_framework import serializers
            -2 写一个类,继承Serializer
            -3 在类内部写属性:
                name=serializers.CharField()
            -4 使用:
                -先生成对象,需要传参数 instance:要序列化的对象(可能是queryset,也可能是单个对象)    
                many:如果是queryset---True,,如果是单个对象--False
            -5 对象.data --->是一个字典
  • 相关阅读:
    C 标准库
    C 标准库
    C 标准库
    C 标准库
    Chrome内核保存为mhtml(单网页)
    C 标准库
    C 标准库
    【转】AOP
    [转]控制反转与依赖注入模式
    [转]乐观锁、悲观锁、死锁的区别
  • 原文地址:https://www.cnblogs.com/zhouhao123/p/10098093.html
Copyright © 2011-2022 走看看