Django重点及面试题

时间:2022-12-21 21:06:46

简述python三大主流web框架

"""
django
	大而全,类似于航空母舰
	但是有时候过于笨重
flask
	小而精,类似于游骑兵(单行代码就可以起一个flask服务)
	第三方组件很多,但是有时候也会受限于第三方
tornado
	异步非阻塞
	速度非常快

SANIC
FASTAPI
...
"""

WSGI,ASGI跟wsgiref和uwsgi是什么关系

WSGI、ASGI是协议,ASGI基于WSGI
wsgiref和uwsgi是实现该协议的功能模块

简述无名有名分组

将匹配到的内容按位置参数传递到视图函数中
将匹配到的内容按关键字参数传到到试图函数中

简述反向解析以及名称空间

反向解析(本质)就是指通过一些方法,得到一个结果,该结果可以访问到对应的url并触发视图函数的运行
名称空间就是解决多个app下出现相同的别名,反向解析不会自动识别应用的前缀

反向解析的应用场景,是因为在软件开发初期,url地址的路径设计可能并不完美,后期需要进行调整,如果项目中很多地方使用了该路径,一旦该路径发生变化,就意味着所有使用该路径的地方都需要进行修改,这是一个非常繁琐的操作。
别名不能出现冲突!!!
# 别名如果发生冲突,未声明命名空间时,不同app下如果有相同的路由别名,反向解析会解析到最下面的app,会发生覆盖

MTV与MVC模型

# MTV:Django号称是MTV模型,其实是借鉴了MVC设计模式
Model:数据存储层,处理所有数据相关的业务,和数据库进行交互,并提供数据的增删改查;
Template:模板层(也叫表现层)具体来处理页面的显示;
View:业务逻辑层,处理具体的业务逻辑,它的作用是连通Model 层和 Template 。
# MVC:其实django本质也是MVC
Modle 代表数据存储层,是对数据表的定义和数据的增删改查;
View 代表视图层,是系统前端显示部分,它负责显示什么和如何进行显示;
Controller 代表控制层,负责根据从 View 层输入的指令来检索 Model 层的数据,并在该层编写代码产生结果并输出。

MTV 是 MVC 的一种细化,将原来 MVC 中的 V 层拿出来进行分离,视图的显示与如何显示交给 Template 层,而 View 层更专注于实现业务逻辑。
其实在 Django 是有 Controller 层的,只不过它由框架本身来实现,所以我们不用关心它。Django 更关注于M、T 和 V。

# vue框架:MVVM模型

FBV和CBV的区别

FBV与CBV在路由匹配上本质是一样的,都是路由对应函数的内存地址
CBV特点:能够直接根据请求方式的不同自动匹配到对应的方法执行

简述CBV流程

特点:能够根据请求方式的不同自动匹配触发对应的方法执行
CBV本质上也是FBV
自定义类调用并执行View中的as_view方法,View类中维护了一个列表,列表中存有8中请求方式,
as_view函数返回一个view函数,view函数返回一个dispatch函数,
dispatch函数中将传入的请求方式变小写,通过反射去列表中查找是否有对应的请求方式,
有的话往后执行,没有就返回信息-不允许该请求方式

数据库查询优化

# only与defer	
# select_related与prefetch_related

"""
**queryset才有惰性查询**
orm语句的特点:
    惰性查询
        如果你仅仅只是书写了orm语句 在后面根本没有用到该语句所查询出来的结果
        那么orm会自动识别 直接不执行
"""
# only与defer
"""
only
	结果是一个列表套多个对象,这些对象默认只有only括号内的属性
	但是也可以点击括号内没有的属性,点击括号内没有的属性需要额外的走数据库操作
defer
	跟only刚好相反
		对象里面唯独没有括号内指定的属性
"""

# select_related与prefetch_related
"""
select_related内部的本质是联表操作 inner join
	括号内只能放外键字段并且多对多不行
		括号内可以放多个外键字段
			select_related(外键字段1__外键字段2__外键字段3__...)
	将联表之后的结果全部查询出来封装到对象里面
	之后对象在点击表的字段的时候都无需再走数据库

prefetch_related内部本质是子查询
	内部通过子查询的方式将多张的表数据也封装到对象中
	这样用户在使用的时候也是感觉不出来的
	
select_related主要用于一对一,一对多。prefetch_related主要用于多对多,也可用于一对多
上述两种方式,在不同的场景下效率各有千秋
"""

Restful规范

https://www.cnblogs.com/hkwJsxl/p/16581564.html

Web服务器和Web应用程序的区别

Web应用程序主要是完成web应用的业务逻辑的处理,Web服务器则主要是应对外部请求的接收、响应和转发。
需要使用web服务器启动运行,web应用程序才能被用户访问到。
而django框架中,我们之所以只有一个web应用程序就跑起来了,是因为我们在终端执行了一个命令,
python manage.py runserver。这个命令启动了django框架中内置提供的测试web服务器。

请描述一个客户端请求从发起到返回的过程(用django来描述);

用户从浏览器发起一个请求,请求来了之后到wsgi解析封装数据,
然后<请求拦截中间件>(process_request),
接着通过url路由匹配,分发到视图,
有render的走中间件的process_view,
需要连接数据库的连接数据库,不需要连接数据库的<响应拦截中间件>(process_response),
最后wsgi打包数据直接响应给浏览器。

Django重点及面试题

请问Django projectDjango app之间有什么区别和联系?

一个django项目可以有多个app,每个app处理不同的业务逻辑

请详细说明Django中间件处理请求的流程(各个处理函数的执行顺序)

django中间件中一共有五个方法:
	process_request
	process_response
	process_view
	process_exception
	process_template_response
主要常用为前两个,当用户发起请求时,会从上到下依次经过每一个中间件,这个时候会触发process_request函数,如果函数返回None,则继续到view视图中,返回HttpResponse响应对象则直接从当前中间件的process_reponse函数返回,正常情况下,视图层处理完后,返回执行中间件process_response函数,最后返回给浏览器
process_view在process_request和process_response之间执行
process_exception在出错时执行
process_template_response在视图层中返回的对象有render方法时执行

请问django中如何进行路由分发操作?

在应用下创建一个urls.py,将关于该应用的逻辑处理放到url里面,然后在总路由下导入该应用的urls

get和filter操作出的结果集是什么数据类型, 有什么区别?

get取到的是模型类对象
filter取到的queryset集合

queryset集合可以包含多个模型类对象

create和save方法有什么区别?

save方法要分为两步,save才是最后操作数据库的语句
create直接操作数据库,一步到位