django生命周期
1.先进入wsgi协议的web服务器
2.进入django的中间件
3.路由
4.视图
5.取模板,取数据,用数据渲染模板
6.返回模板的字符串
7.在wsgi中封装后发送给浏览器
开发模式
1.前后端不分离项目
可以使用django的模板语法进行渲染
2.前后端分离
前端和后端通过json格式数据交互
cbv源码分析
路由如果这么配置:url(r'^test/',views.test.as_views())
请求通过中间件后进入路由,根据路由匹配,一旦成功,会执行后面函数(request),本质就是执行了as_view内部的view函数,内部有调用了self.dispatch。根据请求方式,执行不同的方法(必然get请求,就会执行我们写的视图的get方法)
尝试自己封装一个APIView,重写dispatch方法,在执行父类的dispatch之前,写一些逻辑,请求来了,就会执行这些逻辑
APIView的dispath方法
1.对原生request对象做了一层包装(面向对象的封装),以后再用的request对象都是新的request对象
2.在APIView中self.initial(request,*args,**kwargs),里面有频率控制,权限控制和认证相关
3.根据请求方法执行我们写的视图类中的相应方法
视图类中方法的request对象,已经变成了封装后的request
Request类
1.原生的request是self.request
2.取以post形式提交的数据,从request.data中取(urlencoded,formdata,json格式)
3.query_params就是原生request的GET的数据
4.上传的文件是从FILES中取
5.(重点)其他的属性,直接request.属性名(因为重写了__getattr__方法)
restful规范
面向资源架构
1.API与用户通信协议,总是使用Https协议(相比http有加密的功能)
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.返回结果中提供链接