1 django 请求声明周期
-先进入实现了wsgi协议的web服务器----》进入django---》中间件---》路由---》视图---》取模板,取数据,用数据渲染模板---》返回模板的字符串---》在浏览器上看到页面了
2 开发模式(前后端分离和前后端不分离)
-前后端不分离项目
-前后端分离项目
前端和后端通过json格式数据交互
3 cbv 源码分析
-FBV和CBV
-执行流程:
-路由如果这么配置:url(r'^test/', views.Test.as_view()),
请求通过中间件后进入路由--->根据路由匹配,一旦成功,会执行后面函数(request)---》本质就是执行了as_view内部的view函数----》内部又调用了self.dispatch---->根据请求方式,执行不同的方法(必然get请求,就会执行咱么写的视图类的get方法)
-尝试自己封装一个APIView,重写dispatch方法,在执行父类的dispatch之前,写一些逻辑,请求来了,就会执行这些逻辑
4 restful规范
-面向资源架构
-10条
-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 返回结果中提供链接
5 基于原生django开发restful的接口
-详见代码
6 drf:APIView 的源码,Requset的源码
-安装:
-pip3 install djangorestframework
-pycharm中安装
-使用
-第一步,再写视图,都写cbv
from rest_framework.views import APIView
class Books(APIView):
pass
-在setting中配置
INSTALLED_APPS= [
。。。。。
'rest_framework'
]
-源码分析:
继承了APIView 之后:
-1 所有的请求都没有csrf的认证了
-2 在APIView中as_view本质还是调用了父类的as_view(View的as_view)
-3 as_view中调用dispatch -----》这个dispatch是APIView的dispatch
-APIVIew的dispatch方法:
-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__方法)
7 psotman的安装和使用
模拟向接口发送请求,测试接口
补充:
1 wsgi和cgi:通用网关协议
实现了wsgi协议的web服务器:uwsgi
对应到java中就是tomcat
2 python中一切皆对象
def test():
print('xxxx')
test.name='lqz'
print(test.name)
3 跨域 什么是跨域,如何解决?
4 301和302的区别
301永久更改资源地址
302暂时更改资源地址
5 不同程序可以用同一个数据库
6 django中表名,自己定义
8 DG软件
-pycharm开发
-idea
-goland
-AndroidStadio