CBV源码分析及Restful规范

一、CBV源码分析

1、url层的使用CBV

from app01 import views

url(r'book/',views.Book.as_view)

2、as_view方法

as_view是一个类方法,实际上是一个闭包函数(内层函数包含对外层作用域的使用)

请求来了以后,调用as_view方法,调用函数中的view方法,view方法是调用了dispatch方法

@classonlymethod
    def as_view(cls, **initkwargs):
        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
            # 如果调用的类Book没有写dispatch方法,就会调用View中的dispatch方法
            return self.dispatch(request, *args, **kwargs)
        view.view_class = cls
        view.view_initkwargs = initkwargs

        return view

3、view方法

view 方法是一个闭包函数,最终调用了 dispatch 方法

4、dispatch方法(可以在视图层的CBV中重写)

getattr(self, 'get'[,default])   # 获取对象的get属性的内存地址,如果没有get,返回默认值
setattr(self, 'get', 'get__all')  # 相当于将get的内存地址设置为get__all 的内存地址
hasattr(self,'get')     # 判断对象是否有get 属性

dispatch方法相当于是根据不同的请求方式,分发到对应的函数属性中

def dispatch(self, request, *args, **kwargs):
    # http_method_names -->  ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
    if request.method.lower() in self.http_method_names:
        # 这里的self.http_method_not_allowed 是默认值,如果没有改method,获取其地址
        # 如果是get请求,那么handler就是get;若是post请求,handler相当于post
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)

5、views层的CBV

class Books(View):
    # 获取所有图书
    def get(self, request):
        print(type(request))
        response = {'status': 100, 'data': None}
        books = models.Book.objects.all()
        # 先构造出所有书籍的字典的列表
        ll = [{'name': book.name, 'price': book.price} for book in books]
        # 返回数据是json格式数据
        response['data'] = ll
        # safe = True 表示数据可以是列表
        return JsonResponse(response, safe=False)
 

6、CBV执行过程总结

请求 --> 调用View中的as_view --> 调用as_view中的闭包view --> view中会实例化产生一个对象 --> 调用对象的dispatch --> 没有,去类中找dispatch --> 没有dispatch --> 去View中找,找到dispatch,执行 --> 分发到不同的函数,执行并返回

restful 规范

restful是一种面向资源架构每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词(特殊情况可以使用动词),而且所用的名词往往与数据库的表格名对应。

		-1 API与用户的通信协议,总是使用HTTPs协议。
		-2 域名有区分
			-https://api.example.com
			-https://example.org/api/  
		-3 版本
			-可以放在路径中
			-可以放在请求头中
		-4 路径,视网络上任何东西都是资源,均使用名词表示(重点)
			-https://api.example.com/v1/zoos
		-5 通过method 区分是什么操作
			-get表示获取
			-post表示新增
			-delete表示删除
			-patch/put 表示修改
		-6 过滤,通过在url上传参的形式传递搜索条件
		-7 状态码
			{"status_code":100}
		-8 错误处理,应返回错误信息
			{"status_code":100,'msg':'登录成功'}
			{"status_code":101,'msg':'用户名错误'}
		-9 返回结果,针对不同操作,服务器向用户返回的结果
			-get获取所有资源/get获取一个资源
				-127.0.0.1/api/vi/books  获取所有图书
				{"status_code":100,'msg':'获取成功',data:[{},{}]}
				-127.0.0.1/api/vi/books/3  获取id为3的图书
				{"status_code":100,'msg':'获取成功',data:{name:xx,....}}
				-新增数据,把新增的数据再返回
				-修改了数据,返回完整的资源对象
				-删除数据,返回一个空文档
				
		-10 返回结果中提供链接
			

  

安装与配置

安装

pip install djangorestframework
pip install markdown  # 可选依赖包
pip install django-filter  # 可选依赖包

配置

INSTALLED_APPS = (    
    				...   
                  'rest_framework',
				) 
REST_FRAMEWORK = {    # 编码格式 
    				'UNICODE_JSON': False,}
posted @ 2019-07-09 16:39  会飞的空心菜  阅读(141)  评论(0)    收藏  举报