我的笔记
-
当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端
-
服务端的wsgiref模块接收用户请求并将请求进行初次封装
-
将请求交给Django的中间件
-
通过中间件之后将请求交给url,根据浏览器发送的不同url去匹配不同的视图函数
-
视图函数根据业务逻辑调用数据库获取相应的数据,然或根据模板渲染页面
-
视图函数将响应的页面依次通过中间件
-
到达wsgi,封装数据后反馈给客户端
2.什么wsgi
Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。
WSGI区分为两个部分:一为“服务器”或“网关”,另一为“应用程序”或“应用框架”。在处理一个WSGI请求时,服务器会为应用程序提供环境信息及一个回调函数(Callback Function)。当应用程序完成处理请求后,透过前述的回调函数,将结果回传给服务器。
所谓的 WSGI 中间件同时实现了API的两方,因此可以在WSGI服务器和WSGI应用之间起调解作用:从Web服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。“中间件”组件可以执行以下功能:
实现该协议的模块:
- wsgiref
- werkzurg
FBV
url - 函数
CBV
什么是RESTful架构:
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 什么是接口? 2 3 \- URL 4 5 \- 约束 6 7 \# 约束继承(实现)了他的类中必须含有IFoo中的方法 8 9 interface IFoo: 10 11 def func(self): pass 12 13 14 15 16 17 class Foo(IFoo): 18 19 def func(self): 20 21 print(11111) 22 23 24 25 \1. 根据method不同,进行不同操作 26 27 GET/POST/PUT/DELETE/PATCH 28 29 \2. 面向资源编程 30 31 http://www.luffycity.com/salary 32 33 34 35 \3. 体现版本 36 37 http://www.luffycity.com/v1/salary 38 39 http://www.luffycity.com/v2/salary 40 41 42 43 https://v4.bootcss.com/ 44 45 https://v3.bootcss.com/ 46 47 \4. 体现是API 48 49 http://www.luffycity.com/api/v1/salary 50 51 http://www.luffycity.com/api/v2/salary 52 53 54 55 http://api.luffycity.com/v1/salary 56 57 http://api.luffycity.com/v2/salary 58 59 \5. https 60 61 https://www.luffycity.com/api/v1/salary 62 63 https://www.luffycity.com/api/v2/salary 64 65 66 67 \6. 响应式设置状态码 68 69 200 70 71 300 72 73 400 74 75 500 76 77 return HttpResponse('adfasdf',status=300) 78 79 80 81 \7. 条件 82 83 https://www.luffycity.com/api/v2/salary?page=1&size=10 84 85 86 87 \8. 返回值 88 89 https://www.luffycity.com/api/v2/salary 90 91 GET: 所有列表 92 93 { 94 95 code: 10000, 96 97 data: [ 98 99 {'id':1,'title':'高亮'}, 100 101 {'id':1,'title':'龙泰'}, 102 103 {'id':1,'title':'小东北'}, 104 105 ] 106 107 } 108 109 110 111 POST: 返回新增的数据 112 113 {'id':1,'title':'高亮'} 114 115 116 117 https://www.luffycity.com/api/v2/salary/1/ 118 119 GET: 获取单条数据 120 121 {'id':1,'title':'高亮'} 122 123 PUT:更新 124 125 {'id':1,'title':'高亮'} 126 127 PATCH: 局部更新 128 129 {'id':1,'title':'高亮'} 130 131 DELETE:删除 132 133 134 135 \9. 返回错误信息 136 137 { 138 139 code: 100001, 140 141 error: 'xxx错误' 142 143 } 144 145 146 147 \10. Hypermedia API 148 149 ret = { 150 151 code: 1000, 152 153 data:{ 154 155 id:1, 156 157 name:'小强', 158 159 depart_id:http://www.luffycity.com/api/v1/depart/8/ 160 161 } 162 163 } 164 165 166 167 建议大家使用restful规范
5.django rest framework框架
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
- 路由, - 可以通过as_view传参数,根据请求方式不同执行相应的方法 - 可以在url中设置一个结尾,类似于: .json - 视图, - 帮助开发者提供了一些类,并在类中提供了多个方法以供我们使用。 - 版本, - 在url中设置version参数,用户请求时候传入参数。在request.version中获取版本,根据版本不同做不同处理 - 认证, - 写一个类并注册到认证类,在类的的authticate方法中编写认证逻辑。 - 认证成功(user,auth) - raise AuthticateFaild(....) - None - 权限 - 写一个类并注册到权限类,在类的的has_permission方法中编写认证逻辑。 - True - False - 频率限制 - 写一个类并注册到频率类,在类的的 allow_request/wait 方法中编写认证逻辑。 allow_request - True - False 如果返回False,那么就要执行wait - 解析器, - 根据ContentType请求头,选择不同解析器对 请求体中的数据进行解析。 POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:url-formendo.... \r\n\r\nuser=alex&age=123 POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:application/json\r\n\r\n{....} - 分页 - 对从数据库中获取到的数据进行分页处理: SQL -> limit offset - 根据页码:http://www.luffycity.com/api/v1/student/?page=1&size=10 - 根据索引:http://www.luffycity.com/api/v1/student/?offset=60&limit=10 - 根据加密:http://www.luffycity.com/api/v1/student/?page=erd8 赠送:页码越大速度越慢,为什么以及如何解决? 原因:页码越大向后需要扫描的行数越多,因为每次都是从0开始扫描。 解决: - 限制显示的页数 - 记录当前页数据ID最大值和最小值,再次分页时,根据ID现行筛选,然后再分页。 - 序列化 - 对queryset序列化以及对请求数据格式校验。 - 渲染器 - 根据URL中传入的后缀,决定在数据如何渲染到到页面上。
6.三次握手与三次挥手
答案详解:TCP握手与挥手
本文来自博客园,作者:YanceDev,转载请注明原文链接:https://www.cnblogs.com/yance-dev/p/9853420.html