Rest Framework:一,认识RESTful

一、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--->分发到不同的函数,执行函数,拿到结果,然后返回

阅读源码:(pycharm)
 左侧工程栏--->设置图标-->点击--->show members(能看到py文件,类的方法)

二、resful规范(是什么)

    - 是一个规范
    - 面向资源编程:把网络中所有东西,想象成资源

    -规范:

        -10条规范

               1、-API与用户的通信协议,总是使用HTTPs协议:https比http安全       

               2、-域名

                        https://api.example.com  尽量将API部署在专用域名(会存在跨域问题)
                        https://example.org/api/  API很简单
                        例如写一个查询所有图书的api接口:

                        https://api.example.com/books

                        https://127.0.0.1/api/books

               3、版本:每个接口都应该有版本

                   URL

                        如:https://api.example.com/v1/   

                                https://127.0.0.1/api/v2/books(推荐用这种)
                                请求头 跨域时,引发发送多次请求
               4、路径,视网络上任何东西都是资源,均使用名词表示(可复数)
                                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

               5、method

                   GET      :从服务器取出资源(一项或多项)
                   POST    :在服务器新建一个资源
                   PUT      :在服务器更新资源(客户端提供改变后的完整资源)
                   PATCH  :在服务器更新资源(客户端提供改变的属性)
                   DELETE :从服务器删除资源

               6、过滤,通过在url上传参的形式传递搜索条件

      • https://api.example.com/v1/zoos?limit=10:指定返回记录的数量

      • https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置

      • https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数

      • https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序

      • https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件

                 7、状态码

                    请求回去,需要有状态码
                    自定义状态码
                    status: 100表示成功
                                101表示用户名密码错误
                                102我也不知道什么错误

               8、错误处理,应返回错误信息,error当做key。

                            -{status:100,error:'错误信息写上'}

                 9、返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。

                                GET /books:返回资源对象的列表(数组)
                                GET /books/1:返回单个资源对象
                                POST /books:返回新生成的资源对象    -新增,传数据,一旦新增完成,把新的资源对象返回
                                PUT /books/1:返回完整的资源对象
                                PATCH /books/1:返回完整的资源对象
                                DELETE /books/1:返回一个空文档

                 10、Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。

                 {
                    status:100
                    msg:成功
                    url:127.0.0.1/books/1
                }
            核心:返回结果中提供链接

  1、django写resful规范的接口

猜你喜欢

转载自blog.51cto.com/silencezone/2329160
今日推荐