django面试题
1. Django架构:MVT:
Django遵循MVC设计,并有一个专有的名词:MVT
1.M全拼为Model,与MVC的M功能相同,负责数据处理,内嵌了ORM框架。
2.V全拼为View,与MVC中的C功能相同,接收HttpRequest,业务处理,返回HttpResponse
3.T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html,内嵌了模板引擎
2. 缓存雪崩
大量的KEY设置了相同的过期时间,导致缓存在同一时间全部失效,造成瞬间DB请求量大,压力骤增,引起雪崩。
解决:给缓存设置过期时间加上一个随机时间,不会集中在同一时刻失效。
3. 对Django的认识?
1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。
2.Django内置的ORM跟框架内的其他模块耦合程度高。应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利;理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修。
3.Django的卖点是超高的开发效率,其性能扩展有限;采用Django的项目,在流量达到一定规模后,都需要对其进行重构,才能满足性能的要求。
4.Django适用的是中小型的网站,或者是作为大型网站快速实现产品雏形的工具。
5.Django模板的设计哲学是彻底的将代码、样式分离; Django从根本上杜绝在模板中进行编码、处理数据的可能。
4. Django中MIDDLEWARES中间件的作用和应用场景?
中间件是介于request与response处理之间的一道处理过程,用于在全局范围内改变Django的输入和输出。
简单的来说中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作
例如:1.Django项目中默认启用了csrf保护,每次请求时通过CSRF中间件检查请求中是否有正确token值2.当用户在页面上发送请求时,通过自定义的认证中间件,判断用户是否已经登陆,未登陆就去登陆。3.当有用户请求过来时,判断用户是否在白名单或者在黑名单里
5. Django生命周期:
1.当用户在浏览器中输入url时,浏览器会生成请求头和请求体发送给服务端。
2.url经过Django中的wsgi,再经过Django的中间件,最后Url到路由映射表,在路由中一条条匹配;一旦其中一条匹配成功就执行对应的视图函数,后面的路由就不再继续匹配。
3.视图函数根据客户端的请求查询相应的数据,返回给Django,让Django把客户端想要的数据作为一个字符串返回给客户端。
4.客户端浏览器接受到返回的数据,经过渲染后显示给用户。
6. django中csrf的实现机制?
1.django第一次响应来自某客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中,同时,后端把这个token放到cookie中交给前端页面;
2.下次前端需要发起请求的时候把这个token值加入到请求数据或者头信息中,一起传给后端
3.后端校验前端请求带过来的token和SESSION里的token是否一致。
7. Django flask tomaoto三者区别?
Django:python界最全能的web开发框架,各种功能完善,可维护性金和开发速度一级棒。
Flas:微框架的典范,号称python代码写得最好的项目之一。flask灵活。
Tornado:天生异步,性能强悍,诸多的功能需要自己完善。
参考链接:http://www.cnblogs.com/lmh001/p/9790799.html
---------------------------------------------------
1.Django走的是大而全的方向,开发效率高。它的MTV框架,自带的ORM,admin后台管理,自带的sqlit数据库和开发测试用的服务器给开发者提高了超高的开发效率
2.Flask是轻量级的框架,自由,灵活,可扩展性很强,核心基于Werkzeug WSGI工具和jinja2模板引擎
3.Tornado走的是少而精的方向,性能优越。它最出名的是异步非阻塞的设计方式
参考链接:https://www.cnblogs.com/chongdongxiaoyu/p/9403399.html
8. 简述什么是FBV和CBV
FBV(function base views)就是在视图函面使用函数处理请求
CBV(class base views)就是在视图里面使用类处理请求
9. 命令migrate 和makemigrations的差别
makemigrations 生成迁移文件
migrate 执行迁移
10. HTTP响应常见状态码分类
11. 路由匹配原则是什么?
····关于正则匹配优先级
在url匹配列表中,如果第一条和第二条同时满足匹配规则,则优先匹配第一条。
在url匹配列表中,如果第一条为正则模糊匹配,第二条为精确匹配,则优先匹配第一条
12. 解决跨域的常用方式是什么?
跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。
广义的跨域:1.) 资源跳转: A链接、重定向、表单提交2.) 资源嵌入: link script img frame等dom标签,还有样式中background:url()、@font-face()等文件外链3.) 脚本请求: js发起的ajax请求、dom和js对象的跨域操作等
未完待续,占坑...
13. Django重定向你是如何实现的?用的什么状态码?
- 使用HttpResponseRedirect
- redirect 和 reverse
- 状态码:302,301
14. django的ORM?
orm是什么?优势?
Django的一个强大功能就是它的对象关系映射ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库;
通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动。
在更换数据库的时候,只需要更换数据库的引擎配置信息即可,无需重写数据库的语句。
Django orm数据库的开发步骤:
1.在settings.py中更换数据库的设置
2.在应用的model.py中定义模型类。
3.生成迁徙文件python manage.py makemigrations -> 在migrations文件夹生成0001_intial.py
4.执行迁移文件同步到数据库python mange.py migrate -> 在数据库中生成对应的数据 test01_department 等
5.通过ORM的模型类,进行增删改查等工作。
参考链接:https://blog.csdn.net/weixin_42419806/article/details/80643399
15. Django 本身提供了 runserver,为什么不能用来部署?
runserver方法是调试Django时经常用到的运行方式,它使用Django自带的WSGI Server运行;注意:在测试和开发中使用,并且runserver开启的方式也是单进程。
WSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。注意:uwsgi是一种通信协议,而uWSGI是实现uwsgi协议和WSGI协议的web服务器。
uWSGI具有超快的性能、地内存和多app管理等优点,并且搭配着Nginx就是一个生产环境了,能够将用户访问请求与应用app个离开,实现真正的部署。
相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提高性能。
16.解释blank和null有什么区别?
blank设置为True时,字段可以为空。设置为False时,字段是必须填写的。如果为True,字段允许为空,默认不允许。字段型字段CharField和TextField是用空字符串来存储空值的。
null设置为True时,django用Null来存储空值。日期型、时间型和数字型字段不接受空字符串。所以设置IntegerField, DateTimeField型字段可以为空时,需要将blank,null均设为True.如果为True,空值将会被存储为Null,默认为False。如果像设置BooleanField为空时可以选用NullBooleanField型字段。
一句话概括:null 是针对数据库而言,如果null=True,表示数据库的该字段可以为空。NULL represents non-existent data.blank 是针对表单的,如果blank=True,表示你的表单填写该字段的时候可以不填。
17.get请求和post请求的区别
1.get请求在浏览器地址栏拼接明文传输,post在请求体内稍微安全点。
2.get方式提交的数据最多是1024字节,而post没有限制。
3.get可以收藏为书签,而post不可以。
4.get和post在服务端请求数据的方式不一样。
18.什么是Cookie、如何获取、设置Cookie
会话跟踪技术,保留用户
Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。
具体一个浏览器针对一个服务器存储的key-value({})
response.set_cookir("is_login",True) #设置cookie
resquest.COOKIES.get("is_login") #获取cookie
19.什么是session,与cookie的对比、设置、获取、清空session
Session是服务器端技术,服务器在运行的时候可以为每一个用户创建一个独享的session对象,由于session为用户浏览器独享,所以用户访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其他web资源时,其他web资源再从用户各自的session中取出数据为用户服务。
resquest.session['is_login'] =True
is_login = resquest.session.get("is_login")
request.session.flush()
20. values()与values_list()有什么区别?
#values : 取字典的queryset
#values_list : 取元组的queryset
21.urlpatterns中的name与namespace有什么作用?你是如何使用的?
name:别名,给路由起一个别名。
namespace:名称空间,防止多个路由之间的路由重复。
未完待续...
原文链接:http://www.manbanzhen.top/?p=170
参考链接:https://www.cnblogs.com/wenyule/p/699aa722eb4f9b16acf554df2337ec6f.html
https://www.cnblogs.com/chongdongxiaoyu/p/9403399.html
www.ofus.ink
原文链接:http://www.manbanzhen.top/?p=170