5. django 中间件的使用?
Django 在中间件中预置了六个方法,这六个方法的区别在于不同的阶段执行,对输入或输出进行干 预,方法如下 :
6. 谈一下你对 uWSGI 和 nginx 的理解?
WSGI
它不是服务器、python模块、框架、API或者任何软件,只是一种描述web服务器 如何与web应用程序(如用Django、Flask框架写的程序)通信的规范、协议。
uWSGI
uWSGI是一个全功能的HTTP服务器,实现了WSGI协议、uwsgi协议、http协议等。它要做的就是把HTTP协议转化成语言支持的网络协议。比如把HTTP协议转化成WSGI协议,让Python可以直接使用。
uwsgi
与WSGI一样,是uWSGI服务器的独占通信协议,用于定义传输信息的类型。每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西
Nginx
Nginx是一个Web服务器其中的HTTP服务器功能和uWSGI功能很类似,但是Nginx还可以用作更多用途,比如最常用的反向代理功能。
nginx的作用:
1. 反向代理,可以拦截一些web攻击,保护后端的web服务器
2. 负载均衡,根据轮询算法,分配请求到多节点web服务器
3. 缓存静态资源,加快访问速度,释放web服务器的内存占用,专项专用
uWSGI的适用:
1. 单节点服务器的简易部署
2. 轻量级,好部署
7. 说说 nginx 和 uWISG 服务器之间如何配合工作的?
1. 浏览器发起 http 请求到 nginx 服务器2
2. Nginx 根据接收到请求包,进行 url 分析,判断访问的 资源类型,
如果是静态资源,直接读取静态资源返回给浏览器,
如果请求的是动态资源就转交给 uwsgi 服务器,
3. uwsgi 服务器根据自身的 uwsgi 和 WSGI 协议,找到对应的 Django 框架,Django 框架下的 应用进行逻辑处理后,将返回值发送到 uwsgi 服务器
4. 然后 uwsgi 服务器再返回给 nginx
5. 最后 nginx 将返回值返回给浏览器进行渲染显示给用户。
8. django 开发中数据库做过什么优化?
1. 使用标准的数据库优化技术:
比如给字段加索引,通过使用 django.db.models.Field.db_index 来给一个Django模型类的字段加索引,设置这个属性字段的 Field.db_index=True 。
注:django对model中的fk和unique = True的字段将自动创建索引。
2. 理解Django中QuerySet的工作机制对数据库访问优化至关重要:
QuerySet是懒加载的,它只有在需要的时候才会被执行,并且会将执行的结果保存在内存中。
3. 理解Django中QuerySet的缓存机制:
QuerySet对调用方法是不执行缓存的。比如下面的两端代码,其中一个会被缓存,另一个不会:
4. 使用模板语言中的with标签:
在视图模板中,针对QuerySet对象使用with标签,可以让数据被缓存起来使用。
5. 使用iterator()方法:
对于缓存的QuerySet使用iterator()方法。
6. 将查询计算操作放在数据库中完成,不要在Python代码中完成。
1. 使用fifilter,exclude完成查询过滤;
2. F()查询表达式;
3. 使用聚合函数来完成数据库聚合操作。
7. 使用QuerySet.extra()明确的指出要查询的字段。
8. 对于复杂的数据库查询操作,使用原生SQL实现。
9. 尽量一次查询出所有需要的信息。
10. 只查询需要的数据:
1. 某些情况下,只使用 QuerySet.values()和 values_list()方法,查询出符合条件的结果集而不是完整的对象结果集;
2. 某些情况下,只使用 QuerySet.defer() 和 only()过滤数据。
11. 如果只是查询集合的数量,使用QuerySet.count()函数,而不是len(QuerySet);
12. 如果想知道某个记录是否包含在某个结果集中,使用 QuerySet.exists()函数;
13. 避免过多的使用 count() 和 exists() 函数;
14. 对于批量更新和删除操作使用 QuerySet.update() 和 QuerySet.delete();
9. 验证码过期时间怎么设置?
将验证码保存到数据库或 session,设置过期时间为 1 分钟,然后页面设置一个倒计时(一般是前端 js 实现 这个计时)的展示,一分钟过后再次点击获取新的信息。
10. Python 中三大框架各自的应用场景?
1. Django
Django是一个开放源代码的Web应用框架,由Python写成。采用了MVT的框架模式,即模型M,模板T和视图V。主要是用来搞快速开发的,他的亮点就是快速开发,节约成本
2. Flask
轻量级,主要是用来写接口的一个框架,实现前后端分离,提升开发效率,Flask 本身相当于一 个内核,其他几乎所有的功能都要用到扩展(邮件扩展 Flask-Mail,用户认证 Flask-Login),都需要 用第三方的扩展来实现。比如可以用 Flask-extension 加入 ORM、窗体验证工具,文件上传、身份验 证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。
3. Tornado
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。
11、django 如何提升性能(高并发)?
> 对一个后端开发程序员来说,提升性能指标主要有两个一个是并发数,另一个是响应时间网站性能 的优化一般包括 web 前端性能优化,应用服务器性能优化,存储服务器优化。
对前端的优化主要有:
1. 减少 http 请求,减少数据库的访问量,比如使用雪碧图。
2. 使用浏览器缓存,将一些常用的 css,js,logo 图标,这些静态资源缓存到本地浏览器,通过设 置 http 头中的 cache-control 和 expires 的属性,可设定浏览器缓存,缓存时间可以自定义。
3. 对 html,css,javascript 文件进行压缩,减少网络的通信量。
对我个人而言,我做的优化主要是以下三个方面:
1. 合理的使用缓存技术,对一些常用到的动态数据,比如首页做一个缓存,或者某些常用的数据做 个缓存,设置一定得过期时间,这样减少了对数据库的压力,提升网站性能。
2. 使用 celery 消息队列,将耗时的操作扔到队列里,让 worker 去监听队列里的任务,实现异步操 作,比如发邮件,发短信。
3. 就是代码上的一些优化,补充:nginx 部署项目也是项目优化,可以配置合适的配置参数,提升 效率,增加并发量。
4. 如果太多考虑安全因素,服务器磁盘用固态硬盘读写,远远大于机械硬盘,这个技术现在没有普 及,主要是固态硬盘技术上还不是完全成熟, 相信以后会大量普及。
5. 另外还可以搭建服务器集群,将并发访问请求,分散到多台服务器上处理。
6. 最后就是运维工作人员的一些性能优化技术了
12、什么是 restful api,谈谈你的理解?
REST:Representational State Transfer 的缩写,翻译:“具象状态传输”。一般解释为“表现层 状态转换”。
REST 是设计风格而不是标准。是指客户端和服务器的交互形式。我们需要关注的重点是如何设计 REST 风格的网络接口。
REST 的特点:
1. 具象的。一般指表现层,要表现的对象就是资源。比如,客户端访问服务器,获取的数据就是资 源。比如文字、图片、音视频等。
2. 表现:资源的表现形式。txt 格式、html 格式、json 格式、jpg 格式等。浏览器通过 URL 确定资 源的位置,但是需要在 HTTP 请求头中,用 Accept 和 Content-Type 字段指定,这两个字段是对资源 表现的描述。
3. 状态转换:客户端和服务器交互的过程。在这个过程中,一定会有数据和状态的转化,这种转化 叫做状态转换。其中,GET 表示获取资源,POST 表示新建资源,PUT 表示更新资源,DELETE 表示删 除资源。HTTP 协议中最常用的就是这四种操作方式。
RESTful 架构:
1. 每个 URL 代表一种资源;
2. 客户端和服务器之间,传递这种资源的某种表现层;
3. 客户端通过四个 http 动词,对服务器资源进行操作,实现表现层状态转换。
13. 如何设计符合 RESTful 风格的 API
1. 域名:
将 api 部署在专用域名下: http://api.example.com
或者将 api 放在主域名下: http://www.example.com/api/
2. 版本:
将 API 的版本号放在 url 中。
http://www.example.com/app/1.0/info
http://www.example.com/app/1.2/info
3. 路径:
路径表示 API 的具体网址。每个网址代表一种资源。 资源作为网址,网址中不能有动词只能有 名词,一般名
词要与数据库的表名对应。而且名词要使用复数。
错误示例:
http://www.example.com/getGoods
http://www.example.com/listOrders
正确示例:
获取单个商品 `http://www.example.com/app/goods/1`
获取所有商品 `http://www.example.com/app/goods`
4. 使用标准的 HTTP 方法:
对于资源的具体操作类型,由 HTTP 动词表示。 常用的 HTTP 动词有四个。
GET SELECT :从服务器获取资源。
POST CREATE :在服务器新建资源。
PUT UPDATE :在服务器更新资源。
DELETE DELETE :从服务器删除资源。
示例:
获取指定商品的信息 GET http://www.example.com/goods/ID
新建商品的信息 POST http://www.example.com/goods
更新指定商品的信息 PUT http://www.example.com/goods/ID
删除指定商品的信息 DELETE http://www.example.com/goods/ID
5. 过滤信息:
如果资源数据较多,服务器不能将所有数据一次全部返回给客户端。API 应该提供参数,过滤返 回结果。 实 例:
指定返回数据的数量 http://www.example.com/goods?limit=10
指定返回数据的开始位置 http://www.example.com/goods?offset=10
指定第几页,以及每页数据的数量 http://www.example.com/goods?page=2&per_page=20
6. 状态码:
服务器向用户返回的状态码和提示信息,常用的有:
200 OK :服务器成功返回用户请求的数据
201 CREATED :用户新建或修改数据成功。
202 Accepted:表示请求已进入后台排队。
400 INVALID REQUEST :用户发出的请求有错误。
401 Unauthorized :用户没有权限。
403 Forbidden :访问被禁止。
404 NOT FOUND :请求针对的是不存在的记录。
406 Not Acceptable :用户请求的的格式不正确。
500 INTERNAL SERVER ERROR :服务器发生错误。
7. 错误信息:
一般来说,服务器返回的错误信息,以键值对的形式返回 { error: 'Invalid API KEY' }
8. 响应结果: data
针对不同结果,服务器向客户端返回的结果应符合以下规范
返回商品列表 GET http://www.example.com/goods
返回单个商品 GET http://www.example.com/goods/cup
返回新生成的商品 POST http://www.example.com/goods
返回一个空文档 DELETE http://www.example.com/goods
9. 使用链接关联相关的资源:
在返回响应结果时提供链接其他 API 的方法,使客户端很方便的获取相关联的信息。
10. 其他:
服务器返回的数据格式,应该尽量使用 JSON,避免使用 XML。