Python常见面试题(七)

 

请解释或描述一下Django的架构

  对于Django框架遵循MVC设计,并且有一个专有名词:MVT;

  M全拼为Model,与MVC中的M功能相同,负责数据处理,内嵌了ORM框架;

  V全拼为View,与MVC中的C功能相同,接收HttpRequest,业务处理,返回HttpResponse;

  T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html,内嵌了模板引擎;

 

分别从前端、后端、数据库阐述web项目的性能优化

该题目网上有很多方法,我不想截图网上的长串文字,看的头疼,按我自己的理解说几点

前端优化:

  • 1、减少http请求、例如制作精灵图
  • 2、html和CSS放在页面上部,javascript放在页面下面,因为js加载比HTML和Css加载慢,所以要优先加载html和css,以防页面显示不全,性能差,也影响用户体验差

后端优化:

  • 1、缓存存储读写次数高,变化少的数据,比如网站首页的信息、商品的信息等。应用程序读取数据时,一般是先从缓存中读取,如果读取不到或数据已失效,再访问磁盘数据库,并将数据再次写入缓存。
  • 2、异步方式,如果有耗时操作,可以采用异步,比如celery
  • 3、代码优化,避免循环和判断次数太多,如果多个if else判断,优先判断最有可能先发生的情况

数据库优化:

  • 1、如有条件,数据可以存放于redis,读取速度快
  • 2、建立索引、外键等

 

简述Django的orm

ORM,全拼Object-Relation Mapping,意为对象-关系映射

实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码只需要面向对象编程,orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句,所有使用Django开发的项目无需关心程序底层使用的是MySQL、Oracle、sqlite....,如果数据库迁移,只需要更换Django的数据库引擎即可

1.django 中当一个用户登录 A 应用服务器(进入登录状态),然后下次请求被 nginx 代理到 B 应用服务器会出现什么影响?

  如果用户在A应用服务器登陆的session数据没有共享到B应用服务器,纳米之前的登录状态就没有了。

 

2.跨域请求问题django怎么解决的(原理)

  • 启用中间件
  • post请求
  • 验证码
  • 表单中添加{%csrf_token%}标签

 

4.django对数据查询结果排序怎么做,降序怎么做,查询大于某个字段怎么做

  • 排序使用order_by();
  • 降序需要在排序字段名前加-
  • 查询字段大于某个值:使用filter(字段名_gt=值);

 

5.说一下Django,MIDDLEWARES中间件的作用?

答:中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。

 

6.你对Django的认识?

  • Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台;
  • Django内置的ORM跟框架内的其他模块耦合程度高;
  • 应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利;理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修;
  • Django的卖点是超高的开发效率,其性能扩展有限;采用Django的项目,在流量达到一定规模后,都需要对其进行重构,才能满足性能的要求;
  • Django适用的是中小型的网站,或者是作为大型网站快速实现产品雏形的工具;
  • Django模板的设计哲学是彻底的将代码、样式分离; Django从根本上杜绝在模板中进行编码、处理数据的可能;

7. Django重定向你是如何实现的?用的什么状态码?

  使用HttpResponseRedirect

  redirect和reverse

  状态码:302,301

 

8.ngnix的正向代理与反向代理?

正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

 

9. Tornado 的核是什么?

Tornado 的核心是 ioloop 和 iostream 这两个模块,前者提供了一个高效的 I/O 事件循环,后者则封装了 一个无阻塞的 socket 。通过向 ioloop 中添加网络 I/O 事件,利用无阻塞的 socket ,再搭配相应的回调 函数,便可达到梦寐以求的高效异步执行。

 

10.Django 本身提供了 runserver,为什么不能用来部署?

  • runserver 方法是调试 Django 时经常用到的运行方式,它使用 Django 自带的;
  • WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程;
  •  uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。注意 uwsgi 是一种通信协议,而 uWSGI 是实现 uwsgi 协议和 WSGI 协议的 Web 服务器。uWSGI 具有超快的性能、低内存占用和多 app 管理等优点,并且搭配着 Nginx;
  • 就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署 。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能;
posted @ 2019-11-10 23:32  PythonGirl  阅读(214)  评论(0)    收藏  举报