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集合的應用
        用來防止重復事件發生


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM