一、http协议相关
1.超文本协议,基于tcp协议的应用层协议,端口号80
本质是一个socket客户端,请求--相应----断开
2.无连接无状态
解决无状态可以用cookie和session
3.请求首行 请求头和请求体,请求头和请求体之间用双\r\n分隔
4、常用状态码
200成功
301临时重定向
302永久重定向
403csrf——token错误
5、常用方法 get post put patch delete options
6、重要的请求头有cookie contenttype useragent referer(跳转原防盗链使用)
请求体:发送post请求后,request.post只能接受urlencoded格式,无法获取ajax发送的请求,而request.body均可以拿到
二、django的生命周期,包含restframework
wsgi-----中间件------process_request------process_匹配到url-------process_view-----执行视图-------process_template_response
三、中间件是什么?做过什么?
就是对请求执行前的操作部分,有内置的csrf session 也有自定义的
认证,权限 频率 session 静态文件 跨域
四。csrf原理
请求是带着一个字符串,post请求时需要带着这个字符串
五、restful 10大规范
1. 根据method不同,进行不同操作
GET/POST/PUT/DELETE/PATCH
2. 面向资源编程
http://www.luffycity.com/salary
3. 体现版本
http://www.luffycity.com/v1/salary
http://www.luffycity.com/v2/salary
https://v4.bootcss.com/
https://v3.bootcss.com/
4. 体现是API
http://www.luffycity.com/api/v1/salary
http://www.luffycity.com/api/v2/salary
http://api.luffycity.com/v1/salary
http://api.luffycity.com/v2/salary
5. https
https://www.luffycity.com/api/v1/salary
https://www.luffycity.com/api/v2/salary
6. 响应式设置状态码
200
300
400
500
return HttpResponse('adfasdf',status=300)
7. 条件
https://www.luffycity.com/api/v2/salary?page=1&size=10
8. 返回值
https://www.luffycity.com/api/v2/salary
GET: 所有列表
{
code: 10000,
data: [
{'id':1,'title':'高亮'},
{'id':1,'title':'龙泰'},
{'id':1,'title':'小东北'},
]
}
POST: 返回新增的数据
{'id':1,'title':'高亮'}
https://www.luffycity.com/api/v2/salary/1/
GET: 获取单条数据
{'id':1,'title':'高亮'}
PUT:更新
{'id':1,'title':'高亮'}
PATCH: 局部更新
{'id':1,'title':'高亮'}
DELETE:删除
9. 返回错误信息
{
code: 100001,
error: 'xxx错误'
}
10. Hypermedia API
ret = {
code: 1000,
data:{
id:1,
name:'小强',
depart_id:http://www.luffycity.com/api/v1/depart/8/
}
}
六、restframework组件
路由-----视图-----版本-----认证------权限-----频率----解析器----序列化----分页-----渲染器
七、你写的类就继承过哪些类?
1. 谈谈你对restful 规范的理解? - restful其实就是一套编写接口的协议,协议规定如何编写以及如何设置返回值、状态码等信息。 - 最显著的特点: restful: 给用户一个url,根据method不同在后端做不同的处理,比如:post 创建数据、get获取数据、put和patch修改数据、delete删除数据。 no rest: 给调用者很多url,每个url代表一个功能,比如:add_user/delte_user/edit_user/ - 当然,还有协议其他的,比如: - 版本,来控制让程序有多个版本共存的情况,版本可以放在 url、请求头(accept/自定义)、GET参数 - 状态码,200/300/400/500 - url中尽量使用名词,restful也可以称为“面向资源编程” - api标示: api.luffycity.com www.luffycity.com/api/ ... ..... 2. 你的restful是怎么学的? - 因为之前公司要写这样项目 - 接口 - 公司要做前后端分离的项目 - 公司要做微信小程序的开发 - 所以就开始学习restful规范,看的技术文章 阮一峰的博客学到的规范。 3. 状态码都有哪些? 4. method都有哪些? 5. 常见请求头有哪些? 6. 你是用什么开发的restful接口? 使用django rest framework框架。 7. 为什么要使用django rest framework框架? 在编写接口时可以不适用django rest framework框架, 如果不使用:也可以做,那么就可以django的CBV来实现,开发者编写的代码会更多一些。 如果 使用:内部帮助我们提供了很多方便的组件,我们通过配置就可以完成相应操作,如: - 序列化,可以做用户请求数据校验+queryset对象的序列化称为json - 解析器,获取用户请求数据request.data,会自动根据content-type请求头的不能对数据进行解析 - 分页,将从数据库获取到的数据在页面进行分页显示。 还有其他: - 认证 - 权限 - 访问频率控制 - ... 8. rest framework 视图你都用过哪些基类? a. 继承 APIView 这个类属于rest framework中顶层类,内部帮助我们实现了只是基本功能:认证、权限、频率控制,但凡是数据库、分页等操作都需要手动去完成,比较原始。 class GenericAPIView(APIView) def post(...): pass b. 继承 GenericViewSet(ViewSetMixin, generics.GenericAPIView) 如果继承它之后,路由中的as_view需要填写对应关系 .as_view({'get':'list','post':'create'}) 在内部也帮助我们提供了一些方便的方法: - get_queryset - get_object - get_serializer 注意:要设置queryset字段,否则会跑出断言的异常。 # 只提供增加功能 class TestView(GenericViewSet): serializer_class = XXXXXXX def create(self,*args,**kwargs): pass # 获取数据并对数据进行操作 c. 继承 - ModelViewSet - mixins.CreateModelMixin,GenericViewSet - mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet 对数据库和分页等操作不用我们在编写,只需要继承相关类即可。 示例:只提供增加功能 class TestView(mixins.CreateModelMixin,GenericViewSet): serializer_class = XXXXXXX 类的继承关系 9. 认证流程? - 如何编写?写类并实现authticate - 方法中可以定义三种返回值: - (user,auth),认证成功 - None , 匿名用户 - 异常 ,认证失败 - 流程: - dispatch - 再去request中进行认证处理 10. 访问频率控制 - 匿名用户,根据用户IP或代理IP作为标识进行记录,为每一个用户在redis中创建一个列表 { throttle_1.1.1.1:[1526868876.497521,152686885.497521...] throttle_1.1.1.2:[1526868876.497521,152686885.497521...] throttle_1.1.1.3:[1526868876.497521,152686885.497521...] throttle_1.1.1.4:[1526868876.497521,152686885.497521...] throttle_1.1.1.5:[1526868876.497521,152686885.497521...] } 每个用户再来访问时,需要先去记录中剔除以及过期时间,再根据列表的长度判断是否可以继续访问。 如何封IP:在防火墙中进行设置 - 注册用户,根据用户名或邮箱进行判断。 { throttle_xxxx1:[1526868876.497521,152686885.497521...] throttle_xxxx2:[1526868876.497521,152686885.497521...] throttle_xxxx3:[1526868876.497521,152686885.497521...] throttle_xxxx4:[1526868876.497521,152686885.497521...] } 每个用户再来访问时,需要先去记录中剔除以及过期时间,再根据列表的长度判断是否可以继续访问。 1分钟:40次 11. 接口的幂等性?(是否会造成2次伤害) 一个接口通过1次相同的访问,再对该接口进行N次相同的访问时候,对资源不造影响,那么就认为接口具有幂等性。 比如: GET, 第一次获取结果、第二次也是获取结果对资源都不会造成影响,幂等。 POST,第一次新增数据,第二次也会再次新增,非幂等。 PUT, 第一次更新数据,第二次不会再次更新,幂等。 PATCH,第一次更新数据,第二次不会再次更新,非幂等。 DELTE,第一次删除数据,第二次不在再删除,幂等。 12. Https和Http区别? 端口: http:80 https: 443 流程: - 自定义证书 - 认证机构