Django面试题汇总
1.django请求的生命周期?
1.wsgi,请求封装后交给web框架
2.中间件,对请求进行校验或者在请求对象中添加其他相关数据,
3.路由匹配,根据浏览器发送的不同url去匹配不同的视图函数
4.视图函数,在视图函数中进行业务逻辑的处理
5.中间件,对响应的数据进行处理
6.wsgi,将响应的内容发送给浏览器
2.列举django中间件的5个方法?以及django中间件的应用场景?
1.process_request
接收到客户端信息后立即执行,视图函数之前
2.process_response
返回到客户端信息前最后执行,视图函数之后
3.process_view
拿到视图函数的名称,参数,执行process_view()方法
4.process_exception
视图函数出错时执行
5.process_template_response
在视图函数执行完后立即执行,前提是视图返回的对象中有一个render()方法
3.谈谈你对restfull 规范的认识?
#首先restful是一种软件架构风格或者说是一种设计风格,并不是标准,它只是提供了一组设计#原则和约束条件,主要用于客户端和服务器交互类的软件。
#就像设计模式一样,并不是一定要遵循这些原则,而是基于这个风格设计的软件可以更简洁,更#有层次,我们可以根据开发的实际情况,做相应的改变。
#它里面提到了一些规范,例如:
#1.restful 提高了代码的复用性,可以使用面向对象的技术倡面向资源编程,在url接口中尽量要使用名词,不要使用动词
#2、在url接口中推荐使用Https协议,让网络接口更加安全
#https://www.bootcss.com/v1/mycss?page=3
#(Https是Http的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,
#因此加密的详细内容就需要SSL(安全套接层协议))
#3、在url中可以体现版本号
#https://v1.bootcss.com/mycss
#不同的版本可以有不同的接口,使其更加简洁,清晰
#4、url中可以体现是否是API接口
#https://www.bootcss.com/api/mycss
#5、url中可以添加条件去筛选匹配
#https://www.bootcss.com/v1/mycss?page=3
#6、可以根据Http不同的method,进行不同的资源操作
#(5种方法:GET / POST / PUT / DELETE / PATCH)
#7、响应式应该设置状态码
#8、有返回值,而且格式为统一的json格式
#9、返回错误信息
#返回值携带错误信息
#10、返回结果中要提供帮助链接,即API最好做到Hypermedia
#如果遇到需要跳转的情况 携带调转接口的URL
ret = {
code: 1000,
data:{
id:1,
name:‘小强‘,
depart_id:http://www.luffycity.com/api/v1/depart/8/
}
}
4.django rest framework框架中都有那些组件?
1.序列化组件:serializers 对queryset序列化以及对请求数据格式校验
2.路由组件routers 进行路由分发
3.视图组件ModelViewSet 帮助开发者提供了一些类,并在类中提供了多个方法
4.认证组件 写一个类并注册到认证类(authentication_classes),在类的的authticate方法中编写认证逻
5.权限组件 写一个类并注册到权限类(permission_classes),在类的的has_permission方法中编写认证逻辑。
6.频率限制 写一个类并注册到频率类(throttle_classes),在类的的allow_request/wait 方法中编写认证逻辑
7.解析器 选择对数据解析的类,在解析器类中注册(parser_classes)
8.渲染器 定义数据如何渲染到到页面上,在渲染器类中注册(renderer_classes)
9.分页 对获取到的数据进行分页处理, pagination_class
10.版本 版本控制用来在不同的客户端使用不同的行为
在url中设置version参数,用户请求时候传入参数。在request.version中获取版本,根据版本不同 做不同处理
5.django rest framework框架中的视图都可以继承哪些类?
#class View(object):
#class APIView(View): 封装了view,并且重新封装了request,初始化了各种组件
#class GenericAPIView(views.APIView):
#1.增加了一些属性和方法,如get_queryset,get_serializer
#class GenericViewSet(ViewSetMixin, generics.GenericAPIView)
#父类ViewSetMixin 重写了as_view,返回return csrf_exempt(view)
#并重新设置请求方式与执行函数的关系
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):pass
#继承了mixins下的一些类,封装了list,create,update等方法
#和GenericViewSet
6.简述 django rest framework框架的认证流程。
1.cbv的实现原理
通过as_view方法,执行dispatch函数,在dispatch函数中通过request的method方法,调用视图类的不同方法
2.继承rest frame work的APIview类
APIView继承了Django的View,并且重写了dispatch方法
重写的dispatch方法除了保留分发功能,同时做了以下几个操作:
1.封装request
封装的request返回一个request类的实例对象
authentication_classes是一个放置认证类的列表,那么get_authenticators方法返回的就是认证的实例化对象列表,传入到重写的request对象中
2.执行initial方法
perform_authentication函数
调用封装后的requestd对象的user
user方法调用了_authenticate方法
_authenticate方法中,self.authenticators其中self指的是封装后的request对象
_authenticate方法就是对认证类对象列表进行循环执行,并且是执行认证类对象中的authenticate方法,将返回值user_auth_tuple复制给self.user和self.auth
7.django rest framework如何实现的用户访问频率控制?
from rest_framework.throttling import SimpleRateThrottle
这里使用的节流类是继承了SimplePateThrottle类,而这个类利用了django内置的缓存来存储访问记录。通过全局节流设置,所有的视图类默认是使用UserThrottle类进行节流,如果不想使用默认的类就自定义给throttle_classes属性变量赋值,如:“throttle_classes = [VisitThrottle,]”。
8.Celery 分布式任务队列
情景:用户发起 request,并等待 response 返回。在本些 views 中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件、手机验证码等。
使用 celery 后,情况就不一样了。解决:将耗时的程序放到 celery 中执行。
将多个耗时的任务添加到队列 queue 中,也就是用 redis 实现 broker 中间人,然后用多个 worker 去监听队列里的任务去执行。
任务 task:就是一个 Python 函数。
队列 queue:将需要执行的任务加入到队列中。
工人 worker:在一个新进程中,负责执行队列中的任务。
代理人 broker:负责调度,在布置环境中使用 redis。
9.drf继承过哪些视图类?以及他们之间的区别?
第一种:APIView 第一种遵循了CBV的模式,里面的功能比较多但是需要自己写的代码也有很多 提供了免除csrf认证,版本处理、认证、权限、节流、解析器、筛选器、分页、序列化、渲染器 ? ?
第二种:ListAPIView,RetrieveAPIView,CreateAPIView,UpdateAPIView,DestroyAPIView
第二种则在第一种的基础上,封装了许多我们需要自己的写的代码,许多功能的实现只需要给专属的变量名赋值就可以实现该功能 ? ?
第三种:GenericViewSet、ListModelMixin,RetrieveModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin
第三种则重构了APIView中的as_view()方法,结合请求方法和不同Mixin类的方法名从而进行执行不同的功能。
与前面两种最主要的区别是url路由中as_view()方法中需要传值。
目前使用的主要目的是把第二种的bug(查询全部数据的功能和查询单个数据的功能无法在一个类中实现)实现在一个类中!
10.什么是jwt? 它的优势是什么?
jwt的全称是json web token,
一般用于用户认证 jwt的实现原理: - 用户登录成功之后,会给前端返回一段token。
- token是由.分割的三段组成。
- 第一段header:类型+算法+base64url加密 -
- 第二段paylod:用户信息+超时时间+base64url加密 -
- 第三段sign:hs256(前两段拼接)加密 + base64url - 以后前端再次发来信息时 - 超时验证 - token合法性校验
优势: - token只在前端保存,后端只负责校验。 - 内部集成了超时时间,后端可以根据时间进行校验是否超时。 - 由于内部存在hash256加密,所以用户不可以修改token,只要一修改就认证失败。
11.drf版本的实现过程?
# drf自带的版本类 "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.URLPathVersioning",
# 允许出现的版本 "ALLOWED_VERSIONS": [‘v1‘, ‘v2‘],
# 如果没有传版本,可以使用默认版本 default_version = api_settings.DEFAULT_VERSION
# 设置url中获取版本的变量,默认是version version_param = api_settings.VERSION_PARAM
12.drf组件提供的功能
免除csrf认证 视图(三种:(1)APIView,(2)ListAPIview,(3)ListModelMixin)
版本处理 认证 权限 节流(频率限制)
解析器 筛选器 分页
序列化和数据校验:
可以对QuerySet进行序列化,也可以对用户提交的数据进行校验——展示特殊的数据
depth source:无需加括号,在源码内部会去判断是否可执行,如果可执行自动加括号。
【多对一、一对一/choice】 SerializerMethodField定义钩子方法【多对多】
渲染器:可以帮我们把json数据渲染到drf自己的页面上。
13.GenericAPIView视图类的作用
GenericAPIView主要为drf内部帮助我们提供增删改查的类LIstAPIView、CreateAPIView、UpdateAPIView、提供了执行流程和功能,
我们在使用drf内置类做增删改查时,就可以通过自定义 静态字段(类变量)或重写方法(get_queryset、get_serializer_class)来进行更高级的定制。
14.django-debug-toolbar的作用?
用来调试请求的接口
15.django中如何实现单元测试?
django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试
16.django的缓存能使用redis吗?如果可以的话,如何配置?
redis可以干什么
1.记录评论数,热度,浏览量
2.记录我的收藏,我的文章,等列表类数据
3.记录谋篇文章的点赞人员列表
4.缓存频繁访问但是不太多的东西,例如:热门推荐
5.记录与当前浏览的对象相关的对象
6.记录分类排行榜
7.缓存历史记录
string的应用
缓存用户基本信息
list的应用
通常用作异步队列,存储列表数据
hash的作用
无序字典,字典的值是字符串
可以对用户信息的每个字段单独存储
set集合的应用
用来防止重复事件发生