关于Django+Nginx部署的最完整五十道面试题

文章目录

  • 1.Django的常用命令
  • 2.Django创建项目和子应用后的组成部分
  • 3.对 MVC,MVT 解读的理解
  • 4.ORM查表的语句
  • 5.django 中间件的使用
  • 6.谈一下你对 uWSGI 和 Nginx 的理解
  • 7.django 开发中数据库做过什么优化
  • 8.验证码过期时间怎么设置
  • 9.Python 中三大框架各自的应用场景
  • 10.django 如何提升性能(实现高并发)
  • 11.什么是 restful api,谈谈你的理解
  • 12.什么 csrf 攻击原理?如何解决?
  • 13.怎样测试django 框架中的代码
  • 14.有过部署经验?用的什么技术?可以满足多少压力
  • 15.Django 中哪里用到了线程?哪里用到了协程?哪里用到了进程?
  • 16.django关闭浏览器,怎样清除 cookies 和 session
  • 17.代码优化从哪些方面考虑?有什么想法
  • 18.有用过 Django REST framework 吗
  • 19.Celery 分布式任务队列
  • 20.Jieba 分词
  • 21.简述 Django 下的(内建的)缓存机制
  • 22.请简述浏览器是如何获取一枚网页的
  • 23.对 cookie与session 的了解?他们能单独用吗
  • 24.Django HTTP 请求的处理流程
  • 25.Django里QuerySet的get和filter方法的区别
  • 26.django 中当一个用户登录 A 应用服务器(进入登录状态),然后下次请求被 nginx代理到 B 应用服务器会出现什么影响?
  • 27.跨域请求问题 django 怎么解决的
  • 28.Django对数据查询结果排序怎么做,降序怎么做,查询大于某个字段怎么做
  • 29.Django 重定向你是如何实现的?用的什么状态码
  • 30.关系型数据库的关系包括哪些类型
  • 31.查询集返回列表的过滤器有哪些?
  • 32.判断查询集正是否有数据?
  • 33. Django 本身提供了 runserver,为什么不能用来部署?
  • 34. apache 和 nginx 的区别
  • 35. varchar 与 char 的区别?
  • 36.查询集两大特性?惰性执行*
  • 37.git 常用命令
  • 38. HttpRequest 和 HttpResponse 是什么?
  • 39.什么是反向解析
  • 40.Django 日志管理
  • 41.ORM和SQLAlchemy的区别
  • 42.请简述celery
  • 43.收集静态文件
  • 44.cookie和session区别
  • 45简述TemplateDoesNotExits排错思路
  • 46.Django模板变量中对点的理解
  • 47.Django中常用的标签和过滤器

1.Django的常用命令

创建项目:django-admin startproject 项目名称
创建子应用:python manage.py startapp 应用app名
检查配置:python manage.py check
数据迁移:python manage.py makemigrations
应用到数据库:python manage.py migrate
创建超级用户:python manage.py createsuperuser
运行项目:python manage.py runserver
收集静态文件:python manage.py collectstatic

2.Django创建项目和子应用后的组成部分

关于Django+Nginx部署的最完整五十道面试题_第1张图片

关于Django+Nginx部署的最完整五十道面试题_第2张图片


3.对 MVC,MVT 解读的理解

MVC:

  • M:Model,模型,和数据库进行交互
  • V:View,视图,负责产生 Html 页面
  • C:Controller,控制器,接收请求,进行处理,与 M 和 V 进行交互,返回应答。
    关于Django+Nginx部署的最完整五十道面试题_第3张图片

(1) 用户点击注按钮,将要注册的信息发送给网站服务器。
(2)Controller 控制器接收到用户的注册信息,Controller 会告诉 Model 层将用户的注册信息保存到数据库
(3)Model 层将用户的注册信息保存到数据库
(4) 数据保存之后将保存的结果返回给 Model 模型,
(5)Model 层将保存的结果返回给 Controller 控制器。
(6)Controller 控制器收到保存的结果之后,或告诉 View 视图,view 视图产生一个 html 页面。
(7)View 将产生的 Html 页面的内容给了 Controller 控制器。
(8)Controller将Html页面的内容返回给浏览器。
(9)浏览器接受到服务器 Controller 返回的 Html 页面进行解析展示。

MVT:

  • M:Model,模型,和 MVC 中的 M 功能相同,和数据库进行交互。
  • V:view,视图,和 MVC 中的 C 功能相同,接收请求,进行处理,与 M 和 T 进行交互,返回应答。
  • T:Template,模板,和 MVC 中的 V 功能相同,产生 Html 页面.

关于Django+Nginx部署的最完整五十道面试题_第4张图片

(1)用户点击注册按钮,将要注册的内容发送给网站的服务器。
(2) View 视图,接收到用户发来的注册数据,View 告诉 Model 将用户的注册信息保存进数据库。
(3)Model 层将用户的注册信息保存到数据库中。
(4)数据库将保存的结果返回给 Model
(5)Model 将保存的结果给 View 视图。
(6)View 视图告诉 Template 模板去产生一个 Html 页面。
(7)Template 生成 html 内容返回给 View 视图。
(8)View 将 html 页面内容返回给浏览器。
(9) 浏览器拿到 view 返回的 html 页面内容进行解析,展示。


4.ORM查表的语句

方法 使用和注意
all() 返回模型类对应表格中的所有数据。
get() 返回表格中满足条件的一条数据,如果查到多条数据,则抛异常:MultipleObjectsReturned, 查询不到数据,则抛异常:DoesNotExist。
filter() 参数写查询条件,返回满足条件 QuerySet 集合数据。BookInfo.object.filter(id exact=1)
exclude 返回不满足条件的数据,BookInfo.objects.exclude(id=3)
F 对 象 用于类属性之间的比较条件。from django.db.models import F例:where bread > bcomment BookInfo.objects.filter(bread gt =F(‘bcomment’))
Q 对 象 作用:用于查询时的逻辑条件。可以对 Q 对象进行&
order_by 返 回 QuerySet作用:对查询结果进行排序。例 : BookInfo.objects.all().order_by(‘id’)
聚合函数 作用:对查询结果进行聚合操作。sum count max min avg,aggregate:调用这个函数来使用聚合。from django.db.models import Sum,Count,Max,Min,Avg例:BookInfo.objects.aggregate(Count(‘id’))
count 函 数 作用:统计满足条件数据的数目。例:统计所有图书的数目。BookInfo.objects.all().count()

模型类关系

关系 举例
一对多关系 例:图书类-英雄类models.ForeignKey() 定义在多的类中。
多对多关系 例:新闻类-新闻类型类models.ManyToManyField() 定义在哪个类中都可以。
一对一关系 例:员工基本信息类-员工详细信息类models.OneToOneField() 定义在哪个类中都可以。

5.django 中间件的使用

Django 在中间件中预置了六个方法,这六个方法的区别在于不同的阶段执行,对输入或输出进行干预,方法如下:

(1)初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件。

def init (): 
	pass

(2)处理请求前:在每个请求上调用,返回 None 或 HttpResponse 对象。

def process_request(request):
	pass

(3)处理视图前:在每个请求上调用,返回 None 或 HttpResponse 对象。

def process_view(request, view_func, view_args, view_kwargs): 

	pass

(4)处理模板响应前:在每个请求上调用,返回实现了 render 方法的响应对象。

def process_template_response(request, response):

	pass

(5)处理响应后:所有响应返回浏览器之前被调用,在每个请求上调用,返回 HttpResponse 对象。

def process_response(request, response): 

	pass

(6)异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个 HttpResponse 对象。

def process_exception(request,exception):

	pass
	

6.谈一下你对 uWSGI 和 Nginx 的理解

1.定义:

(1)uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。
(2)Nginx 是一个开源的高性能的 HTTP 服务器和反向代理。Nginx 中HttpUwsgiModule 的作用是与 uWSGI 服务器进行交换。

2.Nginx的优点:

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

3.Nginx的正向代理和反向代理
web 开发中,部署方式大致类似。简单来说,使用 Nginx 主要是为了实现分流、转发、负载均衡, 以及分担服务器的压力。Nginx 部署简单,内存消耗少,成本低。Nginx 既可以做正向代理,也可以做反向代理。

  • 正向代理:请求经过代理服务器从局域网发出,然后到达互联网上的服务器。特点:服务端并不知道真正的客户端是谁。
  • 反向代理:请求从互联网发出,先进入代理服务器,再转发给局域网内的服务器。特点:客户端并不知道真正的服务端是谁。

区别:正向代理的对象是客户端。反向代理的对象是服务端。

3.注意 WSGI / uwsgi / uWSGI 这三个概念的区分

  • WSGI 是一种通信协议。
  • uwsgi 是一种线路协议而不是通信协议,在此常用于在 uWSGI 服务器与其他网络服务器的数据通信。
  • uWSGI 是实现了 uwsgi 和 WSGI 两种协议的 Web 服务器。

4.nginx 和 uWISG 服务器之间如何配合工作的

首先浏览器发起 http 请求到 nginx 服务,Nginx 根据接收到请求包,进行 url 分析,判断访问的资源类型,如果是静态资源,直接读取静态资源返回给浏览器,如果请求的是动态资源就转交给 uwsgi 服务,uwsgi 服务根据自身的 uwsgi 和 WSGI 协议,找到对应的 Django 框架,Django 框架下的应用进行逻辑处理后,将返回值发送到 uwsgi 服务,然后 uwsgi 服务再返回给 nginx,最后 nginx 将返回值返回给浏览器进行渲染显示给用户。


7.django 开发中数据库做过什么优化

(1)设计表时,尽量少使用外键,因为外键约束会影响插入和删除性能;

(2)使用缓存,减少对数据库的访问;

(3)在 orm 框架下设置表时,能用 varchar 确定字段长度时,就别用 text;

(4)可以给搜索频率高的字段属性,在定义时创建索引;

(5)Django orm 框架下的 Querysets 本来就有缓存的;

(6)如果一个页面需要多次连接数据库,最好一次性取出所有需要的数据,减少对数据库的查询次数;

(7)若页面只需要数据库里某一个两个字段时,可以用 QuerySet.values();

(8)在模板标签里使用 with 标签可以缓存 Qset 的查询结果。


8.验证码过期时间怎么设置

  • 方法一:将验证码保存到数据库或 session,设置过期时间为 1 分钟,然后页面设置一个倒计时(一般是前端js 实现这个计时)的展示,一分钟过后再次点击获取新的信息。
  • 方法二:将验证码存入普通数据库,获取的时候存入时间戳,然后使用的时候获取当前时间戳,与获取时候的时间戳相减,当小于规定时间可以使用,超出时间不可用

9.Python 中三大框架各自的应用场景

django:

主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过 10000, 如果要实现高并发的话,就要对 django 进行二次开发,比如把整个笨重的框架给拆掉,自己写 socket 实现 http 的通信,底层用纯 c,c++写提升效率,ORM 框架给干掉,自己编写封装与数据库交互的框架,因为啥呢,ORM 虽然面向对象来操作数据库,但是它的效率很低,使用外键来联系表与表之间的查询;

flask:

轻量级,主要是用来写接口的一个框架,实现前后端分离,提升开发效率,Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展 Flask-Mail,用户认证 Flask-Login),都需要用第三方的扩展来实现。比如可以用 Flask-extension 加入 ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。

其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。Python 最出名的框架要数 Django,此外还有 Flask、Tornado 等框架。虽然 Flask 不是最出名的框架,但是 Flask 应该算是最灵活的框架之一,这也是 Flask 受到广大开发者喜爱的原因。

Tornado:

Tornado 是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

得利于其非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado是实时 Web 服务的一个 理想框架。


10.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)最后就是运维工作人员的一些性能优化技术了。

11.什么是 restful api,谈谈你的理解

①定义
restful api (url定位资源,采用http来描述操作,常用的get.post.put.delete)是一种符合rest风格的接口,rest是一种架构风格,采用http协议。restful会前后端分离,但是前后端又互相交互,这样的好处就是使前后端解耦,减少服务器压力,前后端分工明确,提高安全性

②rest架构的主要原则

关于Django+Nginx部署的最完整五十道面试题_第5张图片
③解释区分

  • REST:Representational State Transfer 的缩写,翻译:“具象状态传输”。一般解释为“表现层状态转换”。
  • REST 是设计风格而不是标准。是指客户端和服务器的交互形式。我们需要关注的重点是如何设计

④.如何设计符合 RESTful 风格的 API

一、域名:
将 api 部署在专用域名下: http://api.example.com 或者将 api 放在主域名下:http://www.example.com/api/

二、版本:
将 API 的版本号放在 url 中。http://www.example.com/app/1.0/info http://www.example.com/app/1.2/info

三、路径:
路径表示 API 的具体网址。每个网址代表一种资源。 资源作为网址,网址中不能有动词只能有名词,一般名词要与数据库的表名对应。而且名词要使用复数。

错 误 示 例 : http://www.example.com/getGoods [http://www.example.com/listOrders ](http://www.example.com/listOrders)
正确示例:

\#获取单个商品

http://www.example.com/app/goods/1

\#获取所有商品http://www.example.com/app/goods

四、使用标准的 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 ](http://www.example.com/goods/ID)

五、过滤信息:
如果资源数据较多,服务器不能将所有数据一次全部返回给客户端。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

六、状态码:
服务器向用户返回的状态码和提示信息,常用的有: 200 OK :服务器成功返回用户请求的数据

201 CREATED :用户新建或修改数据成功。
202 Accepted:表示请求已进入后台排队。
400 INVALID REQUEST :用户发出的请求有错误。
401 Unauthorized :用户没有权限。
403 Forbidden :访问被禁止。
404 NOT FOUND :请求针对的是不存在的记录。
406 Not Acceptable :用户请求的的格式不正确。
500 INTERNAL SERVER ERROR :服务器发生错误。

七、错误信息:
一般来说,服务器返回的错误信息,以键值对的形式返回。

{
error: 'Invalid API KEY'
}

八、响应结果:
针对不同结果,服务器向客户端返回的结果应符合以下规范。

\#返回商品列表
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 ](http://www.example.com/goods)

九、使用链接关联相关的资源:
在返回响应结果时提供链接其他 API 的方法,使客户端很方便的获取相关联的信息。

十、其他:
服务器返回的数据格式,应该尽量使用 JSON,避免使用 XML。


12.什么 csrf 攻击原理?如何解决?

简单来说就是: 你访问了信任网站 A,然后 A 会用保存你的个人信息并返回给你的浏览器一个cookie,然后呢,在 cookie 的过期时间之内,你去访问了恶意网站 B,它给你返回一些恶意请求代码, 要求你去访问网站 A,而你的浏览器在收到这个恶意请求之后,在你不知情的情况下,会带上保存在本地浏览器的 cookie 信息去访问网站 A,然后网站 A 误以为是用户本身的操作,导致来自恶意网站 C 的攻击代码会被执:发邮件,发消息,修改你的密码,购物,转账,偷窥你的个人信息,导致私人信息泄漏和账户财产安全收到威胁


13.怎样测试django 框架中的代码

在单元测试方面,Django 继承 python 的 unittest.TestCase 实现了自己的

django.test.TestCase,编写测试用例通常从这里开始。测试代码通常位于 app 的 tests.py 文件中(也可以在 models.py 中编写,一般不建议)。在 Django 生成的 depotapp 中,已经包含了这个文件, 并且其中包含了一个测试

用例的样例:

python manage.py test:执行所有的测试用例
python manage.py test app_name, 执行该 app 的所有测试用例
python manage.py test app_name.case_name: 执行指定的测试用例

一些测试工具:unittest 或者 pytest

14.有过部署经验?用的什么技术?可以满足多少压力

1有部署经验,在阿里云服务器上部署的

2.技术有:nginx + uwsgi 的方式来部署 Django 项目

3.无标准答案(例:压力测试一两千)


15.Django 中哪里用到了线程?哪里用到了协程?哪里用到了进程?

Django中耗时的任务用一个进程或者线程来执行,比如发邮件,使用 celery。

部署 django 项目的时候,配置文件中设置了进程和协程的相关配置。


16.django关闭浏览器,怎样清除 cookies 和 session

  • 设置一个过期时间
  • 设置一个清楚cookie和session的视图

17.代码优化从哪些方面考虑?有什么想法

(1)优化算法时间

算法的时间复杂度对程序的执行效率影响最大,在 Python 中可以通过选择合适的数据结构来优化时间复杂度,如 list 和 set 查找某一个元素的时间复杂度分别是 O(n)和 O(1)。不同的场景有不同的优化方式,总得来说,一般有分治,分支界限,贪心,动态规划等思想。

(2)循环优化

尽量减少循环的使用

(3)合理的使用适合函数

在循环的时候使用 xrange 而不是 range;使用 xrange 可以节省大量的系统内存,因为 xrange() 在序列中每次调用只产生一个整数元素。而 range()將直接返回完整的元素列表,用于循环时会有不必要的开销。在 python3 中 xrange 不再存在,里面 range 提供一个可以遍历任意长度的范围的iterator。

(4)并行编程

因为 GIL 的存在,Python 很难充分利用多核 CPU 的优势。但是,可以通过内置的模块multiprocessing 实现下面几种并行模式:

多进程:对于 CPU 密集型的程序,可以使用 multiprocessing 的 Process,Pool 等封装好的类, 通过多进程的方式实现并行计算。但是因为进程中的通信成本比较大,对于进程之间需要大量数据交互的程序效率未必有大的提高。

多线程:对于 IO 密集型的程序,multiprocessing.dummy 模块使用 multiprocessing 的接口封装 threading,使得多线程编程也变得非常轻松(比如可以使用 Pool 的 map 接口,简洁高效)。

分布式:multiprocessing 中的 Managers 类提供了可以在不同进程之共享数据的方式,可以在此基础上开发出分布式的程序。

不同的业务场景可以选择其中的一种或几种的组合实现程序性能的优化。

(5)使用性能分析工具

除了上面在 ipython 使用到的 timeit 模块,还有 cProfile。cProfile 的使用方式也非常简单: python-mcProfilefilename.py,filename.py 是要运行程序的文件名,可以在标准输出中看到每一个函数被调用的次数和运行的时间,从而找到程序的性能瓶颈,然后可以有针对性地优化。

(6)set 的用法

set 的 union,intersection,difference 操作要比 list 的迭代要快。因此如果涉及到求 list 交集,并集或者差的问题可以转换为 set 来操作。

(7)PyPy

PyPy 是用 RPython(CPython 的子集)实现的 Python,根据官网的基准测试数据,它比 CPython 实现的 Python 要快 6 倍以上。快的原因是使用了 Just-in-Time(JIT)编译器,即动态编译器,与静态编译器(如 gcc,javac 等)不同,它是利用程序运行的过程的数据进行优化。由于历史原因,目前 pypy 中还保留着 GIL,不过正在进行的 STM 项目试图将 PyPy 变成没有 GIL 的 Python。如果 python 程序中含有 C 扩展(非 cffi 的方式),JIT 的优化效果会大打折扣,甚至比 CPython 慢(比 Numpy)。所以在 PyPy 中最好用纯 Python 或使用 cffi 扩展。


18.有用过 Django REST framework 吗

Django REST framework 是一个强大而灵活的 Web API 工具。使用 RESTframework 的理由有:

Web browsable API 对开发者有极大的好处包括 OAuth1a 和 OAuth2 的认证策略

支持 ORM 和非 ORM 数据资源的序列化

全程自定义开发——如果不想使用更加强大的功能,可仅仅使用常规的 function-based views 额外的文档和强大的社区支持


19.Celery 分布式任务队列

情景:用户发起 request,并等待 response 返回。在本些 views 中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件、手机验证码等。

使用 celery 后,情况就不一样了。解决:将耗时的程序放到 celery 中执行。

将多个耗时的任务添加到队列 queue 中,也就是用 redis 实现 broker 中间人,然后用多个 worker 去监听队列里的任务去执行。

  • 任务 task:就是一个 Python 函数。
  • 工人worker:在一个新进程中,负责执行队列中的任务,也就是执行单元。
  • 代理人 broker:负责调度,在布置环境中使用Redis,并且负责worker和服务器之间的信息传递。
  • backend:负责存储消息和存储执行结果

20.Jieba 分词

Jieba 分词支持三种分词模式:

  • 精确模式:试图将句子最精确地切开,适合文本分析;
  • 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词功能:

分词,添加自定义词典,关键词提取,词性标注,并行分词,Tokenize:返回词语在原文的起始位置,ChineseAnalyzer for Whoosh 搜索引擎。

jieba详细知识


21.简述 Django 下的(内建的)缓存机制

一个动态网站的基本权衡点就是,它是动态的。 每次用户请求页面,服务器会重新计算。从开销处理的角度来看,这比你读取一个现成的标准文件的代价要昂贵的多。

这就是需要缓存的地方。

Django 自带了一个健壮的缓存系统来保存动态页面这样避免对于每次请求都重新计算。方便起见,

Django 提供了不同级别的缓存粒度:可以缓存特定视图的输出、可以仅仅缓存那些很难生产出来的部分、或者可以缓存整个网站 Django 也能很好的配合那些“下游”缓存, 比如 Squid 和基于浏览器的缓存。这里有一些缓存不必要直接去控制但是可以提供线索, (via HTTPheaders)关于网站哪些部分需要缓存和如何缓存。

设置缓存:

缓存系统需要一些设置才能使用。 也就是说,你必须告诉他你要把数据缓存在哪里- 是数据库中, 文件系统或者直接在内存中。 这个决定很重要,因为它会影响你的缓存性能,是的,一些缓存类型要比其他的缓存类型更快速。

你的缓存配置是通过 setting 文件的 CACHES 配置来实现的。这里有 CACHES 所有可配置的变量值。


22.请简述浏览器是如何获取一枚网页的

(1)在用户输入目的 URL 后,浏览器先向 DNS 服务器发起域名解析请求;

(2)在获取了对应的 IP 后向服务器发送请求数据包;

(3)服务器接收到请求数据后查询服务器上对应的页面,并将找到的页面代码回复给客户端;

(4)客户端接收到页面源代码后,检查页面代码中引用的其他资源,并再次向服务器请求该资源;

(5)在资源接收完成后,客户端浏览器按照页面代码将页面渲染输出显示在显示器上;


23.对 cookie与session 的了解?他们能单独用吗

Session 采用的是在服务器端保持状态的方案,而 Cookie 采用的是在客户端保持状态的方案。但是禁用 Cookie 就不能得到 Session。因为 Session 是用 Session ID 来确定当前对话所对应的服务器 Session,而 Session ID 是通过 Cookie 来传递的,禁用 Cookie 相当于失去了 SessionID,也就得不到 Session。


24.Django HTTP 请求的处理流程

一个 HTTP 请求,首先被转化成一个 HttpRequest 对象,然后该对象被传递给Request 中间件处理,如果该中间件返回了 Response,则直接传递给 Response 中间件做收尾处理。否则的话 Request 中间件将访问 URL 配置,确定哪个 view 来处理,在确定了哪个 view 要执行,但是还没有执行该 view 的时候,系统会把 request 传递给 view 中间件处理器进行处理,如果该中间件返回了 Response,那么该 Response 直接被传递给 Response 中间件进行后续处理,否则将执行确定的 view 函数处理并返回 Response,在这个过程中如果引发了异常并抛出,会被 Exception 中间件处理器进行处理。


25.Django里QuerySet的get和filter方法的区别

get filter
get 的参数只能是 model 中定义的那些字段,只支持严格匹配。 filter 的参数可以是字段,也可以是扩展的 where 查询关键字,如 in,like 等
get 返回值是一个定义的 model 对象。 filter 返回值是一个新的 QuerySet 对象,然后可以对 QuerySet 在进行查询返回新的 QuerySet 对象,支持链式操作,QuerySet 一个集合对象,可使用迭代或者遍历,切片等,但是不等于 list 类型
get 只有一条记录返回的时候才正常,也就说明 get 的查询字段必须是主键或者唯一约束的字段。当返回多条记录或者是没有找到记录的时候都会抛出异常 filter 有没有匹配的记录都可以

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

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


27.跨域请求问题 django 怎么解决的

  • 使用中间件
  • post 请求
  • 验证码
  • 表单中添加csrf_token 标签

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

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


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

使用 HttpResponseRedirect

redirect 和 reverse

状态码:302,301


30.关系型数据库的关系包括哪些类型

· ForeignKey:一对多,将字段定义在多的一端中。
· ManyToManyField:多对对:将字段定义在两端中。
· OneToOneField:一对一,将字段定义在任意一端中。


31.查询集返回列表的过滤器有哪些?

  • all() :返回所有的数据
  • filter():返回满足条件的数据
  • exclude():返回满足条件之外的数据,相当于 sql 语句中 where 部分的 not 关键字
  • order_by():排序

32.判断查询集正是否有数据?

exists():判断查询集中否有数据,如果有则返回 True,没有则返回 False。


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

runserver 方法是调试 Django 时经常用到的运行方式,它使用 Django 自带的 WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。

uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。注意 uwsgi 是一种通信协议,而 uWSGI 是实现 uwsgi 协议和 WSGI 协议的 Web 服务器。uWSGI 具有超快的性能、低内存占用和多 app 管理等优点,并且搭配着 Nginx 就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势, 提升性能。


34. apache 和 nginx 的区别

Nginx 相对 Apache 的优点:

  • 轻量级,同样起 web 服务,比 apache 占用更少的内存及资源;
  • 抗并发,nginx 处理请求是异步非阻塞的,支持更多的并发连接,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能;
  • 配置简洁;
  • 高度模块化的设计,编写模块相对简单; 社区活跃。

Apache 相对 Nginx 的优点:

  • rewrite ,比 nginx 的 rewrite 强大;
  • 模块多,基本想到的都可以找到;
  • bug 少,nginx 的 bug 相对较多; 超稳定。

35. varchar 与 char 的区别?

char 长度是固定的,不管你存储的数据是多少他都会都固定的长度。而 varchar 则处可变长度但他要在总长度上加 1 字符,这个用来存储位置。所以在处理速度上 char 要比 varchar 快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使用 char 类型,反之可以用 varchar 类型。


36.查询集两大特性?惰性执行*

惰性执行、缓存 。

创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与 if 合用


37.git 常用命令

git常用命令

git clone 克隆指定仓库
git status 查看当前仓库状态git diff 比较版本的区别
git log 查看 git 操作日志git reset 回溯历史版本
git add 将文件添加到暂存区
git commit 将文件提交到服务器git checkout 切换到指定分支git rm 删除指定文件

38. HttpRequest 和 HttpResponse 是什么?

Django 使用Request 对象和Response 对象在系统间传递状态。
当请求一个页面时,Django会建立一个包含请求元数据的 HttpRequest 对象。 当Django 加载对应的视图时,HttpRequest 对象将作为视图函数的第一个参数。每个视图会返回一个HttpResponse 对象。

本文档对HttpRequest 和HttpResponse 对象的API 进行说明,这些API 定义在django.http 模块中。

HttpRequest 对象
属性

HttpRequest.scheme  #一个字符串,表示请求的方案(通常是http或者https)
HttpRequest.body    #一个字节字符串,表示原始HTTP请求的正文
HttpRequest.path    #一个字符串,表示请求的页面的完整路径,不包含域名
HttpRequest.methed   #一个字符串,表示请求使用的HTTP方法,必须使用大写
HttpRequest.GET      #一个类似于字典的对象,包含HTTP GET的所有参数
HttpRequest.POST     #一个包含所有给定的HTTP POST参数的类字典对象,提供了包含表单数据的请求
HttpRequest.COOKIES    #一个标准的python字典,包含所有cookie,键和值都为字符串
HttpRequest.FILES     #一个类似于字典的对象,包含所有的上传文件
HttpRequest.META      #一个标准的python字典,包含所有的HTTP头部

方法:

HttpRequest.get_host()#返回请求的原始主机
HttpRequest.get_full_path()#返回path,如果可以将加上查询字符串
HttpRequest.read(size=None)
HttpRequest.readline()
HttpRequest.readlines()
HttpRequest.xreadlines()
HttpRequest.__iter__()

#这几个方法实现类文件的接口用于读取HttpRequest.示例。这使得可以用流的方式读#取进来的请求,一个常见的用例是使用迭代解析器处理大型XML有效载荷,而不是内存#中构造一个完整的XML树。

QueryDict 对象
在HttpRequest 对象中,GET 和POST 属性是django.http.QueryDict 的实例,它是一个自定义的类似字典的类,用来处理同一个键带有多个值。这个类的需求来自某些HTML 表单元素传递多个值给同一个键, 是一个显著的例子。

HttpResponse 对象
与由Django自动创建的HttpRequest 对象相比,HttpResponse 对象由程序员创建.你创建的每个视图负责初始化实例,填充并返回一个 HttpResponse.

HttpResponse 类是在django.http模块中定义的。

用法-传递字符串

典型的应用是传递一个字符串作为页面的内容到HttpResponse 构造函数:

from django.http import HttpResponse
response = HttpResponse("Here is the text of the web page")
response = HttpResponse("Text only,please",content_type="text/plain")

如果你想增量增加内容,你可以将response 看做一个类文件对象

response = HttpResponse()
response.write("

Here is the text of the web page

"
) response.write("

here is another paragrah

"
)

配置 header fields

把它当作一个类似字典的结构,从你的response中设置和移除一个header field。

response = HttpResponse()
 reponse['Age'] = 20
 del response['Age']

39.什么是反向解析

使用场景:模板中的超链接,视图中的重定向

使用:在定义 url 时为 include 定义 namespace 属性,为 url 定义 name 属性在模板中使用 url 标签:{% url ‘namespace_value:name_value’%}

在视图中使用 reverse 函数:redirect(reverse('namespce_value:name_value’))根据正则表达式动态生成地址,减轻后期维护成本。

注意反向解析传参数,主要是在我们的反向解析的规则后面天界了两个参数,两个参数之间使用空格隔开:位置参数


40.Django 日志管理

配置好之后:

import logging
logger=logging.getLogger( name ) # 为 loggers 中定义的名称
logger.info("some info ...)

可用函数有:logger.debug() logger.info() logger.warning() logger.error()

Django 文件管理:对于 django 老说,项目中的 css,js,图片都属于静态文件,我们一般会将静态文件放到一个单独的目录中,以方便管理,在 html 页面调用时,也需要指定静态文件的路径。静态文件可以放在项目根目录下,也可以放在应用的目录下,由于这些静态文件在项目中是通用的,所以推荐放在项目的根目录下。

在生产中,只要和静态文件相关的,所有访问,基本上没有 django 什么事,一般都是由 nignx 软件代劳了,为什么?因为 nginx 就是干这个的。


41.ORM和SQLAlchemy的区别

①Django中ORM返回类型

返回类型 方法
1.Queryset all,filter,order_by,exclude,values(QuerySet [{},{}]),切片
2.对象 get ,first, last
3.布尔值 exists
4.数字 count

②Django的ORM和Flask的SQLAlchemy

使用的对象的词汇

  • Django中:objects
  • Flask中:query

数据增加

  • Django中:save和create

    person=Person(name='a')
    person.save()
    #--------------------------
    Person.objects.create(name='a')
    
  • Flask中:add和add_all

    # ---------------------单条增加  add
    userinfo = UserInfo(name="老王",age=19)
    db.session.add(userinfo)
    db.session.commit()
    #------------------------------- 多条增加 add_all
    db.session.add_all([
        UserInfo(name="老王",age=19),
        UserInfo(name="老王",age=19),
    ])
    db.session.commit()
    

数据查询方法的区别

ORM SQLAlchemy
get 一般用于查询id,其他条件也可以,查询为空或数据多条会报错,例如:Person.objects.get(id=1) 只能用于查询id,如果没有结果 返回 None,l例如①Person.query.get(1) ②Person.query.get(ident=1)
filter 可以写一个或多个条件(用逗号分隔),Person.objects.filter(id=1) ①Person.query.filter(Person.id==1) ②Person.query.filter_by(id=1)
order_by 排序,两种使用方法 ①倒序:Person.objects.all().order_by("-age") ②正序Person.objects.all().order_by(“age”) ③倒序模型中ording=[’-name’] ①升序: UserInfo.query.order_by(UserInfo.id).all() ②升序:UserInfo.query.order_by(“id”).all() ③降序:UserInfo.query.order_by(UserInfo.id.desc()).all() ④降序:UserInfo.query.order_by(db.desc(“id”)).all()
limit 跳过x条取n条数据,若不跳过不写offset方法UserInfo.query.offset(x).limit(n).all()

数据查询

  • Django:

    -----------------------------save  注意:拿到的结果是对象还是查询集合,可多条循环修改
        先查询到数据,然后进行重新赋值,然后执行save 进行保存
        data = Person.objects.get(id=2)
        data.name = "python"
        data.save()-----------------------------update
        Person.objects.filter(id=2).update(name="java")
    
  • Flask

    #先查询数据
    data = UserInfo.query.filter(UserInfo.id==1).first()
    data.name = "lisi"
    db.session.merge(data)
    db.session.commit()
    

数据删除

  • Django:

    # delete方法
        Person.objects.filter(id=7).delete()
    
  • Flask

    #----------------单条删除delete
    # data = UserInfo.query.filter().first()
    # db.session.delete(data)
    # db.session.commit()
    #----------------多条筛选删除
    data = UserInfo.query.filter(UserInfo.id == 2).delete()
    db.session.commit()
    
    

42.请简述celery

功能:解决定时任务和异步任务,处理耗时任务

组成部分:

  • worker工人,执行任务的单元。

  • broker消息中间件,即中间人用来在服务和woker中 传递消息常用的介质有redis,RabbitMQ。

  • backend用来存储消息以及celery执行结果。

43.收集静态文件

settings中增加配置,并注释其他media和static配置

STATIC_ROOT = os.path.join(BASE_DIR,"static")

执行命令

python manage.py collectstatic

44.cookie和session区别

(1)cookie 数据存放在客户的浏览器上,session 数据放在服务器上。

(2)cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session。

(3)session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 cookie。

(4)单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。

(5)可以考虑将登陆信息等重要信息存放为 session,其他信息如果需要保留,可以放在 cookie 中。

45简述TemplateDoesNotExits排错思路

1、模板目录位置

2、settings配置问题

3、html文件名称

46.Django模板变量中对点的理解

​ 1.字典查询 :如果向页面传递的是一个字典类型变量,变量名.key 获取值

​ 2.属性或方法查询:如果传递一个对象,变量名.变量名

​ (此变量名有可能是属性,有可能是无参数方法名称)。

  1. 数字索引查询:如果传递一个列表,变量名.索引。

47.Django中常用的标签和过滤器

1.过滤器:

default 、length、slice、date、cut、join、

2.标签:

for 、for…empty 、if 、 if …else…、 if…elif…elif… else、load 、staitc、extends、include

你可能感兴趣的:(Django框架知识,面试题)