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

相关推荐