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集合的应用
        用来防止重复事件发生

原文地址:https://www.cnblogs.com/bk770466199/p/12696103.html

时间: 2024-10-06 05:00:32

Django面试题汇总的相关文章

php面试题汇总二(基础篇附答案)

介绍一些php常见面试题及答案,都是平时面试的时候经常会遇到的,小伙伴们仔细了解下吧.接着上一篇php面试题汇总一(基础篇附答案) 1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中:而链接到当前页面的URL记录在预定义变量(2)中. 答:echo $_SERVER['PHP_SELF']; echo $_SERVER["HTTP_REFERER"]; 2:数组函数 arsort 的作用是(6):语句 error_reporting(2047)的作用是(7

秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】

http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. ----------------------

AJAX笔试面试题汇总

AJAX笔试面试题汇总 Javascript 1. 什么是ajax,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么是ajax: AJAX是“Asynchronous JavaScript and XML”的缩写.他是指一种创建交互式网页应用的网页开发技术. Ajax包含下列技术: 基于web标准(standards-based presentation)XHTML+CSS的表示: 使用 DOM(Document Object Model)进行动态显示及交互: 使用 XML 和 XSLT

秒杀多线程第一篇 多线程笔试面试题汇总

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. -------------------------------------华丽的分割线

超全!iOS 面试题汇总

超全!iOS 面试题汇总 2015-10-20 CocoaChina 作者:Job_Yang 之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家.(题目来源于网络,侵删) 1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好

2015年阿里巴巴校招研发工程师在线笔试题汇总

在线笔试题汇总 卷一: 1.下面的函数中哪个是系统调用而不是库函数______? printf scanf fgetc read print_s scan_s 2.某足球队有四名外援,分别来自巴西.荷兰.意大利和美国.他们分别擅长前锋.后卫或守门,其中: ① 美国外援单独擅长守门: ② 意大利外援不擅长前锋: ③ 巴西外援和另外某个外援擅长相同的位置: ④ 荷兰外援擅长的位置和巴西外援不同. 以上条件可以推出巴西外援擅长的位置是______. 前锋 守门 后卫 前锋或守门 后卫或守门 前锋或后卫

Linux面试题汇总答案

转自:小女生的Linux技术~~~Linux面试题汇总答案~~ 一.填空题:1. 在Linux系统中,以 文件 方式访问设备 .2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统.3. Linux文件系统中每个文件用 i节点 来标识.4. 全部磁盘块由四个部分组成,分别为引导块 .专用块 . i节点表块 和数据存储块.5. 链接分为: 硬链接 和 符号链接 .6. 超级块包含了i节点表 和 空闲块表 等重要的文件系统信息.7. 某文件的权限为:d-rw-_r--_r

前端笔试题汇总整理

一.Js对象 1.如何根据逗号分隔的字符串创建数组呢?请为下面的字符串创建一个数组,并访问第三个元素:"cats,dogs,birds,horses" 知识点:数组和字符串的转换.考察split() 方法.把一个字符串分割成字符串数组(将字符串按某个字符切割成若干个字符串,并以数组形式返回) var animalString="cats,dogs,birds,horses"; var animalArray=animalString.split(",&qu

Python面试题汇总

原文:http://blog.csdn.net/jerry_1126/article/details/44023949 拿网络上关于Python的面试题汇总了,给出了自认为合理的答案,有些题目不错,可以从中学到点什么,答案如不妥,请指正...... +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ [题目:001]| 说说你对zen of python的理解,你有什么办法看到它? Python之禅,Python秉承一种独特