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

  • 相关阅读:
    AJAX传输图片文件
    和内嵌的iframe进行通讯
    ts的特殊数据类型
    Angular RxJs:针对异步数据流编程工具
    Angular路由使用
    RBAC基于角色的权限管理模型
    Java中的实体类--Serializable接口、transient 关键字
    字符串问题----将整数字符串转换成整数值
    字符串问题----判断两个字符串是否互为旋转词
    字符串问题----去掉字符串中连续出现K个0的子串
  • 原文地址:https://www.cnblogs.com/bk770466199/p/12696103.html
Copyright © 2020-2023  润新知