前言:
积累知识没有尽头!
正文:
1.HTTP协议是什么?你的理解是?
HTTP协议是建立在TCP协议之上的互联网通信协议,他的本质是客户端(浏览器)发送给服务器端一次请求后服务器返回一次响应后就会断开连接,所以HTTP协议是无状态的,是短链接。
客户端发送给服务器端的数据叫做请求,请求由请求头和请求体组成,他们之间由\r\n\r\n分割,数据的分割使用\r\n
服务器端返回给客户端的数据叫做响应,响应由响应头和响应体组成,分割同请求
2.Django的请求生命周期
客户端通过URL来访问服务器,先经过wsgi模块,wsgi模块会对请求数据进行初次封装。进入Django的中间件之前会进行二次封装,再经过Django的中间件,执行中间件的process_request函数。这个函数会返回None或HttpResponse 对象,None则继续执行下一个中间件,返回对象则直接跳过中间件。中间件之后是路由的分发,分发给视图(CBV或FBV)视图部分负责业务逻辑,有可能会进行对数据库的操作和模板的替换等并返回,然后再经过中间件的process_response函数再通过wsgi向网络传输
3.你对wsgi有什么了解?
wsgi实际上是一个遵循wsgi标准的一个Django组件。是一个socket服务端,它可以实现对请求的封装等。
4.Django的中间件是什么?
中间件实际上就是一个类,他有5个方法。他在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。当接收请求的时候会执行类中的process_request函数,在返回响应的时候经过中间件的process_response函数
·process_request(self,request): 请求到达之后之后先执行这个中间件
·process_view(self, request, callback, callback_args, callback_kwargs):
·process_exception(self, request, exception) 这个方法只有在出现错误的时候才会触发
·process_response(self, request, response):请求处理完成出去之后执行这个自己解决
·process_template_response(self,request,response) 这个方法只有在返回对象中有render方法的时候才执行,如render_to_response('/index/')
5.你使用中间件做过什么?
我利用过中间件的csrftoken模块做过请求的校验,也使用过session模块做过用户的认证
此外,我自己写过权限认证,登陆认证等中间件
6.FBV和CBV是什么?两者有什么区别?你认为哪种好?
我认为FBV和CBV没有太大的差别。FBV和CBV的的本质是一样的,都是执行调用内部的View函数。不过CBV可以通过继承类的方式来便捷的添加组件,FBV可能更好理解。两者都有擅长的情况
7.你对restful规范了解多少?
restful是一种设计原则,一种建议。
restful建议使用HTTPS协议来保证传输的安全性
如果URL是接口就要在URL上体现该URL是一个API接口
URL要体现出版本号方便识别和管理
restful认为网络一切皆资源所以URL的HTTP为名词而非动词
URL上要加条件(参数)来过滤结果
同一个URL的method不同要进行不同的操作
在请求数据发送后,后端要响应数据给前端
后端在返回数据时要带上状态码提高辨识度
如果前端的请求有错误要返回错误信息
Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
8.django rest framework框架有什么作用?有几个插件?
django的rest framework框架是一个快速搭建基于restful规范的接口的类
路由,视图,版本,认证,权限,访问频率,解析器,序列化,分页,渲染
-路由,
-可以通过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中传入的后缀,决定在数据如何渲染到到页面上。
9.django rest framework继承了哪几个类?
APIView,ViewSetMinxin(可以在URL中加字典)
GenericAPIView
GenericViewSet
ModelViewSet
10.django rest framework的访问频率组件原理是什么?
在用户访问的时候在内部的一个字典里记录下该ip和访问时间。ip为键,值为列表,列表内部是访问时间,当该ip第二次访问的时候会在列表第一位添加新的时间,再添加之前会先拿到定义的规定时间,用最新访问的时间减去规定时间并遍历这个列表将规定时间之前的记录删除,留下的就是规定时间内该ip访问的记录,然后就可以判断是否超过规定次数来决定是否禁止访问。但是这种方法不能完全的起到效果因为ip是可以更换的,使用token的方法来确认是否是同一用户好一点但是也不是完美的。我觉得可以对资源进行权限限制比如必须要登陆,然后对账号做限制比如将账号绑定手机号这种,还可以对账号的登陆地点,登陆频率进行监测。
11.跨域是什么?怎么解决?
跨域是浏览器的同源策略导致默认情况下不允许浏览器当前页面请求外域的数据,解决方法有:
jsonP 利用浏览器不拦截有src的标签例如img标签等的跨域请求来动态创建一个script标签
同时在客户端设置一个回调函数,服务器接收到后该函数,客户端接收执行
因为是用script标签所以只能发送GET请求且双方必须约定好函数的名字
cors 设置响应头来告诉浏览器可以跨域
复杂请求的话先发送一个预检,请求是OPTIONS请求,服务器返回浏览器同意发送后才发送正常的请求
在Django中可以写一个中间件来写入请求头达到支持跨域的目的
12. 常见请求头
- Content-Type
- User-Agent
- referer,可以做图片防盗链。
- Host
- cookies
13. 常见的请求方法:
- GET/POST/DELETE/PUT/PATCH/OPTIONS
14. 常见的状态码:
-200
-301/302
-403/404
-500
15.状态码的代表的现象是什么?
返回的状态码和状态不一致的情况是有可能发生得
比如Web应用程序内部错误,但仍然返回 200 OK
200 OK
请求正常处理完毕
204 No Content
请求成功处理,没有实体的主体返回
206 Partial Content
GET范围请求已成功处理
301 Moved Permanently
永久重定向,资源已永久分配新URI
302 Found
临时重定向,资源已临时分配新URI
303 See Other
临时重定向,期望使用GET定向获取
304 Not Modified
发送的附带条件请求未满足
307 Temporary Redirect
临时重定向,POST不会变成GET
400 Bad Request
请求报文语法错误或参数错误
401 Unauthorized
需要通过HTTP认证,或认证失败
403 Forbidden
请求资源被拒绝
404 Not Found
无法找到请求资源(服务器无理由拒绝)
500 Internal Server Error
服务器故障或Web应用故障
503 Service Unavailable
服务器超负载或停机维护
16.类的构造函数是什么?:
类的构造函数是 __init__
但是在实例化的时候在执行 __init__ 之前会先执行 __new__ 函数
17.字符串的类是怎么导入的?
先用 rsplit() 将最后要导入的组件拿出来,然后将前面的导入路径使用getattr() 使用反射导入
18.常见的请求头有哪些?
Accept:告诉服务器,客户端支持的数据类型。
Accept-Charset:告诉服务器,客户端采用的编码。
Accept-Encoding:告诉服务器,客户机支持的数据压缩格式。
Accept-Language:告诉服务器,客户机的语言环境。
Host:客户机通过这个头告诉服务器,想访问的主机名。
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间。
Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的。(一般用于防盗链)
User-Agent:客户机通过这个头告诉服务器,客户机的软件环境。
Cookie:客户机通过这个头告诉服务器,可以向服务器带数据。
Content-Language:服务器通过这个头,告诉服务器的语言环境。
Content-Type:服务器通过这个头,回送数据的类型
19.请求体是什么格式?
Form表单提交:
POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=alex&password=123&...
Ajax请求:
POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=alex&password=123&...
POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\n{“username”:"alex","password":123}
补充:django中获取请求体(未解析过的)
- request.POST
- request.body
20.如果代码出现bug,你们是如何解决?
创建一个bug分支,然后进行bug处理,处理完毕后,合并到master分支。
删除bug分支
回到dev分支继续开发。
21.git rebase的作用?
保持提交记录的整洁。
22.做代码review
如何做代码review?
- 创建review分支:
谁来锁代码review?
- 组长
23.原生Ajax
- XMLHttpRequest