Django面试题
输出1-100的所有偶数
采用取余即可
[i for i in range(1,101) if i % 2==0]
数据库Redis有哪些基本类型
Redis支持五种数据类型:
string(字符串)
hash(哈希)
list(列表)
set(集合)
zset(sorted set,有序集合)
数据库事务是什么?
指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行。简单地说,事务就是并发控制地单位,是用户定义地一个操作序列。而一个逻辑工作单元要成为事务,就必须满足ACID属性。
A.原子性(Atomicity),事务中的操作要么都不做,要么就全做。
C.一致性(Consistency),事务执行的结果必须使数据库从一个一致性状态转换为另一个一致性状态。
I.隔离性(Isolation),一个事务的执行不能被其他事务干扰
D.持久性(Durability),一个事务一旦提交,他对数据库中数据的改变就应该是永久性的。
函数装饰器的作用?
不需要更改任何代码的情况下给该装饰器下的函数增添额外功能。
应用场景:
插入日志,性能测试,事务处理,缓存,权限校验。
什么是metaclass?他有什么应用场景?
metaclass即元类,他是创建类的类,所有的类都是由元类调用new方法创建的,重写元类可以自由控制创建类的过程,比如使用元类创建单例模式或ORM框架,Django的ORM框架实现原理是通过元类实现的。
列举Django中间件常用的钩子函数以及中间件的应用场景。
init():初始化函数,运行Django将自动执行该函数。
process_request():完成请求对象的创建,但用户访问的网址尚未与网站的路由地址匹配。
process_view():完成用户访问的网址与路由地址的匹配,但尚未执行视图函数
process_exception():在执行视图函数的期间发生异常,比如代码异常,主动抛出404异常等
process_response():完成视图的执行,但尚未将响应内容返回浏览器。
中间件不仅能满足复杂的开发需求,还能减少视图函数或视图类的代码量,比如编写Cookie内容实现反爬虫机制、微信公众号开发商城等。
简述Django的生命周期
生命周期是从用户发送HTTP请求到网站响应的过程,整个过程包含:发送HTTP请求-->Ngnix-->uwSgi-->中间件-->路由-->视图-->ORM-->从ORM获取数据返回视图-->视图将数据传递给模板文件-->中间件-->uwsgi-->Nginx-->生成响应内容
简述什么是FBV和CBV.
使用视图函数处理HTTP请求,即在视图里定义def函数,这种方式称为FBV(Function Base Views)。在无须编写大量代码的情况下,快速完成数据视图的开发,这种以类的形式实现响应与请求处理称为CBV.
select_related和prefetch_related的区别是什么?
select_related通过多数据表关联查询,一次性获得所有数据,只执行一次SQL查询;prefetch_related分别查询每个表,然后根据他们之间的关系进行处理,执行了两次查询。
列举Django编写SQL语句的方法
Django提供3种方法执行SQL语句:
extra、raw、execute,每种方法的实现原理各有不同
模型的外键字段的参数on_delete有什么作用
用于设置数据的删除模式,删除模式包括:cascade、protect、set_null、set_default、set和do_nothing.
orm框架的only和defer的区别是什么
only只查询部分的模型字段,defer查询指定字段之外的字段。
示例如下:
User.objects.all().only("id","name","age")只查询字段"id","name","age"
User.objects.all().defer("name")除了name字段外,查询模型User的所有字段
简述ORM框架的values和values_list的区别
values将查询结果以列表表示,列表的每个元素以字典格式表示,每个键值对代表一个模型字段;values_list以列表表示,列表的每个元素以元组表示,元组的每个元素代表模型字段的值。
简述Django中的db first和code first
db first根据现有数据库的数据表结构生成相应的模型对象,使用python manage.py inspectdb指令即可生成模型对象的定义过程。
code first是编写模型对象的定义过程,由模型对象创建相应的数据表,一次执行makemigrations和migrate指令即可。
简述Django中CSRF的实现原理
1.在用户访问网站时,Django在网页表单中生成一个隐藏控件csrfmiddlewaretoken,控件属性value的值是由Django随机生成的。
2.当用户提交表单时,Django校验表单的csrfmiddlewaretoken是否与自己保存的csrfmiddlewaretoken一致,用来判断当前请求是否合法。
3.如果用户被CSRF攻击并从其他地方发送攻击请求,由于其他地方不可能知道隐藏控件csrfmiddlewaretoken的值,因此导致网站后台校验csrfmiddlewaretoken失败,攻击就成功被防御了。
Django有哪些缓存方式?
Memcached
数据库缓存
文件系统缓存
本地内存缓存
虚拟缓存
Django如何实现WebSocket?
django官方推荐使用Channels,Channels通过将HTTP协议升级到WebSocket协议,保证实时通信。也就是说,我们完全可以用channels实现及时通信,而不是使用长轮询和计时器方式来保证伪实时通信。
简述Cookie和Session的区别
Cookie是从浏览器向服务器发送数据,让服务器能够识别当前用户,而服务器对Cookie的识别机制是通过Session实现的,Session存储了当前用户的基本信息。
Django本身提供了runserver,为什么不能用来部署(runserver于uWSGI的区别)
runserver使用的是Django自带的Server运行,主要在测试和开发中使用,并且runserver也是单线程的。
而uWSGI是一个Web服务器,它实现了WSGI、uWSGI、HTTP等协议。uWSGI具有超快的性能、低内存占用等优点,并且搭配着Nginx组成项目的生产环境,能够将用户访问请求于项目应用隔离,实现真正网站的部署。相对来说,这种方式支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。
什么是跨域访问?Django如何解决跨域访问?
跨域访问指的是浏览器不能执行其他网站的JavaScript脚本,他是由浏览器的同源策略造成的,这是浏览器对JavaScript施加的安全限制。
目前解决跨域访问的最佳方案是使用第三功能应用Django cors Headers.