我的笔记

1.django请求生命周期

  1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端

  1. 服务端的wsgiref模块接收用户请求并将请求进行初次封装

  1. 将请求交给Django的中间件

  1. 通过中间件之后将请求交给url,根据浏览器发送的不同url去匹配不同的视图函数

  1. 视图函数根据业务逻辑调用数据库获取相应的数据,然或根据模板渲染页面

  1. 视图函数将响应的页面依次通过中间件

  2. 到达wsgi,封装数据后反馈给客户端

 

2.什么wsgi

Web服务器网关接口Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器Web应用程序框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。

WSGI区分为两个部分:一为“服务器”或“网关”,另一为“应用程序”或“应用框架”。在处理一个WSGI请求时,服务器会为应用程序提供环境信息及一个回调函数(Callback Function)。当应用程序完成处理请求后,透过前述的回调函数,将结果回传给服务器。

所谓的 WSGI 中间件同时实现了API的两方,因此可以在WSGI服务器和WSGI应用之间起调解作用:从Web服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。“中间件”组件可以执行以下功能:

  • 重写环境变量后,根据目标URL,将请求消息路由到不同的应用对象。

  • 允许在一个进程中同时运行多个应用程序或应用框架。

  • 负载均衡和远程处理,通过在网络上转发请求和响应消息。

  • 进行内容后处理,例如应用XSLT样式表。

 

 

实现该协议的模块:

  • wsgiref
  • werkzurg
  • uwsig

3.视图的玩法

FBV

url - 函数

CBV

url - view

4.RESTful规范

什么是RESTful架构:

  (1)每一个URI代表一种资源;

  (2)客户端和服务器之间,传递这种资源的某种表现层;

  (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

  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规范
View Code

5.django rest framework框架

- 路由, 
    - 可以通过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中传入的后缀,决定在数据如何渲染到到页面上。
        
View Code

 

 6.三次握手与三次挥手

答案详解:TCP握手与挥手

 

 

 

 

posted @ 2018-10-25 22:36  YanceDev  阅读(210)  评论(0编辑  收藏  举报