Django面试题

1.Python解释器有哪些类型,有什么特点?

CPython:由C语言开发,而且使用范围最广泛
IPython:基于CPython的一个交互式计时器
PyPy:提高执行效率,采用JIT技术。对Python代码进行动态编译
JPython:运行在Java上的解释器,直接把Python代码编译成Java字节码执行
IronPython:运行在微软.MET平台上的解释器,把Python编译成.NET的字节码

2.什么是PEP8?

《Pyhon Enhancement Proposal》(8号Python增强提案)又叫PEP8,它是针对Python代码格式而编订的编写规范指南,可以在Pycharm配置Autopep8模块,将代码自动调整为PEP8风格。

 

3.什么是Python之禅?

在Python交互模式下,输入import this语句可以获取具体的内容,它告诉大家如何写出高效整洁的代码。

4.使用json模式将字典转换成JSON格式,默认将中文转换成unicode,如何将中文保持不变?

import json
a = json.dumps({"name": "张三"}, ensure_ascii=False)
print(a)

 

5.如何输出1-100的所有偶数?

# 方法1
[i for i in range(1, 101) if i % 2 == 0]

# 方法2
list(range(2, 101, 2))

 

6.Python的数据类型如何相互转换?

数据类型可以使用str、list、tuple、dict和eval实现转换,但转换的数据格式必须符合数据格式要求,比如字符串"{'a':1}"只能转换为字典类型,不能转化为元组或列表。

7.数据库Redis有哪些基本类型?

Redis支持5种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)及zset(sorted set有序集合)

8.数据库事务是什么?

数据库事务指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执。行简单滴说,事务就是并发控制的单位,是用户定义一个操作序列。而一个逻辑工作单元要成为事务就必须满足ACID属性:
A:原子性(Atomicity),事务中的操作要么都不做,要么全做。
C:一致性(Consistency):事务执行的结果必须使数据从一个一致性状态转换到另一个一致性状态。
I:隔离性(Isolation),一个事务的执行不能被其他事务干扰。
D:持久性(Durability),一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

9.函数装饰器有什么作用?举例说明。

装饰器就是一个函数,它可以在不需要做任何代码变动的前提下给下一个函数增加额外功能,启动装饰的效果。它经常用于有切面需求的场景,比如插入日志、性能测试、事务处理、缓存、权限校验等场景。

 

10.什么是metaclass?它有什么应用场景?

metaclass即元类,它是创建类的类,所有的类都是由元类调用new方法创建的,重写元类可以自由控制创建类的过程,比如使用元类创建单例模式或ORM框架,Django的ORM框架实现原理是通过重写元类实现的。

11.列举Django中间件常用的钩子函数以及中间件的应用场景。

__init__():初始化函数,运行Django将自动执行该函数
process_request():完成请求对象的创建,但用户访问的网站尚未与网站的路由地址匹配。
process_view():完成用户访问的网址与网站路由的匹配,但尚未执行视图函数。
process_exception():在执行视图函数期间发生异常,比如代码异常、主动抛出404异常等。
process_response():完成视图的执行,但尚未将响应内容返回浏览器。
中间件不能满足复杂的开发需求,还能减少视图函数或视图类的代码量,比如编写Cookie内容实现反爬机制、微信公众号开发商城等

 

12.简述Django的生命周期。

生命周期是从用户发送HTTP请求到网站响应的过程,整个过程包含:发送HTTP请求-->Nginx-->uwsgi-->中间件-->路由-->视图-->ORM-->从ORM获取数据返回视图-->视图将数据传递给模板文件-->中间件-->uwsgi-->Nginx-->生成响应内容。

13.简述什么是FBV和CBV

使用视图函数处理HTTP请求,即在视图里定义def函数,这种方式称为FBV(Function Based Views)在无需知道大量代码的情况下,快速完成数据视图的开发,这种累的形式实现响应与请求处理称为CBV(Class Based Views)。

 

14.select_related 和 prefetch_related的区别是什么?

select_related通过多数据表关系关联查询,一次性获得所有数据,只执行一次SQL查询;
prefetch_related分别查询每个表,然后根据它们之间的关系进行处理,执行了两次查询。

15.列举Django编写SQL语句的方法。

Django提供3种方法执行SQL语句,extra、raw、execute

16.模型的外键字段参数on_delete有什么作用?

用于设置数据的删除模式,删除模型包括:CASCADE、PROTECT、SET_NULL、SET_DEFAULT

17.ORM的only 和 defer的区别是什么?

# only只查询部分模型字段,defer查询指定字段之外的字段。
User.objects.all().only("id", "name", "age") # 查询这3个字段
User.objects.all().defer("name") # 查询name字段外的所有字段

 

18.简述Django的values 和 values_list的区别。

values将查询结果以列表表示,列表的每个元素以字典格式表示,每个键值对代表一个模型字段;
values_list以列表表示,列表每个元素以元组表示,元组每个元素代表模型字段的值。

19.简述Django中的db first 和 code first。

db first根据现有数据表结构生成相应的模型对象,使用python manage.py inspectdb指令即可生成模型对象的定义过程;
code first是编写模型对象的定义过程,由模型对象创建相应的数据表,依次执行makemigrations和migrate指令。

20.阐述Django中中CSRF实现原理。

(1)在用户访问网站时,Django在网页表单中生成隐藏控件csrfmiddlewaretoken,控件属性value的值是由Django随机生成。
(2)当用户提交表单时,Django校验表单的csrfmiddlewaretoken与资金保存的是否一致,用来判断当前请求是否合法。
(3)如果用户被CSRF攻击并从其他地方发起攻击请求,由于其他地方不知道Django在网页表单中生成隐藏控件csrfmiddlewaretoken的值,因此后台校验Django在网页表单中生成隐藏控件csrfmiddlewaretoken失败,攻击就被成功防御。

21.Django有哪些缓存方式?

Django提供5中不同的缓存方式:Memcached、数据库缓存、文件系统缓存、本地内存缓存和虚拟缓存。

22.Django如何实现WebSocket?

官方推荐使用Channels。Channels通过将HTTP协议升级为WebSocket协议,保证实时通信。也就是说,完全可以使用Channels实现实时通信,而不是使用长轮询和计时器方式来保证伪实时通信。Channels通过改造Django框架,使Django既支持HTTP协议又支持WebSocket协议。

23.简述Cookie 和 Session的区别

Cookie是从浏览器向服务器发送的数据,让服务器能够识别当前用户,而服务器对Cookie的识别机制是通过Session实现的,Session存储了当前用户基本信息。由于Cookie是存储在浏览器中的,就跟容易泄露用户信息,并且Cookie大小不能超过4kb,不支持中文。因此,需要一种机制在服务器的某个域中存储用户数据,这个域就是Session。

 24.Django本身提供runserver,为什么不能用来部署(runserver与uWSGI的区别)?

runserver是调试Django时经常用到的方式,它使用Django自带的WSGI Server运行。只要在开发测试中使用,并且runserver开启方式是单进程的。
uWSGI是一种Web服务器它实现了WSGI、uwsgi、HTTP等协议。uwsgi是一种通信协议,而uWSGI是实现uwsgi和WSGI协议的Web服务器。
uWSGI具体超快的性能、低内存占用等优点,并且搭配着Nginx组成项目的生产环境,能够将用户访问请求与应用隔离,实现真正的网站部署。相对来说,这种方式支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。

25.什么是跨域访问?Django如何解决跨域访问?

跨域访问指的是浏览器不能执行其他网站的JavaScript脚本,它是由浏览器的同源策略造成的,这是浏览器对JavaScript施加的安全限制。
解决跨域访问有多种方式,目前最佳的解决方案是使用第三方功能应用Django Cors Headers。

posted on 2021-02-10 13:14  落叶虽美只活一世  阅读(170)  评论(0编辑  收藏  举报
Live2D