Django 面试题

     阅读:38

1 . Django ORM 查询中select_related 和 prefetch_related 的区别?

def  select_related(self, *fields):
	性能相关:  表之间进行join 连表操作, 一次性获取关联的数据。
	总结:
	1. select_related  主要针对一对一 和 多对一关系进行优化。
	2. select_related  使用 SQL的join  语句进行优化, 通过减少SQ语句的查询的次数来进行优化, 提高性能。

def  prefetch_related(self, *lookups):
	 性能相关: 多表连表操作时速度会慢,使用其执行多次SQL 查询在Python 代码中实现连表操作。
	总结:
	1.  对于多对多字段 (ManyToManyField) 和 一对多字段,可以使用prefetch_related()  进行优化。
	2. prefetch_related() 的优化方式是分贝查询内阁表,然后用Python  处理他们之间的关系。
	

uWSGI 和nginx 的理解

  1. uWSGI 是一个Web 服务器,它实现了WSGI 协议,uwsgi、http 等协议。Nginx 中HttpUwsgiModule 的作用是与uWSGI 服务器进行交换。WSGI 是一种Web 服务器网关接口。它是一个Web 服务器 (如nginx、uWSGI等服务器) 与web 应用 (如用Flask 框架写的程序) 通信的一种规范。
  2. 要注意WSGI/uwsgi / uWSGI 这三个概念的区分。
    WSGI 是一种通讯协议。
    uwsgi 是一种线路协议而不是通讯协议,在此长用于uWSGI 服务器与其他网络服务器的数据通信。
    uWSGI 是实现了uwsgi 和WSGI 两种协议的Web 服务器。

nginx 是一个开源的高性能的HTTP 服务器和反向代理

  1. 作为web 服务器, 它处理静态文件和索引文件效果非常高;
  2. 它的设计非常注重效率, 最大支持5 万个并发连接, 但只占用很少的内存空间;
  3. 稳定性高,配置简洁
  4. 强大的反向代理和负载均衡功能, 平衡集群中各个服务器的负载压力应用。

Django 请求的声明周期

  1. 当用户在浏览器中输入url , 浏览器会生成请求头和请求体发给服务端。
    请求头和请求体中会包含浏览器的动作(action), 这个动作通常为get 或者 post , 体现在url 中 。
  2. url 经过Django 中的wsgi, 再经过Django的中间件, 最后url 到过路由映射表,在路由中一条一条进行匹配, 一旦其中一条匹配成功就执行对应的视图函数,后面的路由就不再继续匹配了。
    3.视图函数根据客户端的请求查询相应的数据, 返回给Django , 然后Django 把客户端想要的数据作为一个字符串返回给客户端。
  3. 客户端浏览器接收到返回的数据, 经过渲染后显示给用户。