溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django面試常見的一些問題

發(fā)布時間:2020-11-24 14:19:31 來源:億速云 閱讀:119 作者:小新 欄目:編程語言

這篇文章主要介紹Django面試常見的一些問題,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

下面總結一下Django面試常見的一些問題

1. 對Django的認識?

1.Django是走大而全的方向,它最出名的是其全自動化的管理后臺:只需要使用起ORM,做簡單的對象定義,它就能自動生成數據庫結構、以及全功能的管理后臺。

2.Django內置的ORM跟框架內的其他模塊耦合程度高。

應用程序必須使用Django內置的ORM,否則就不能享受到框架內提供的種種基于其ORM的便利;

理論上可以切換掉其ORM模塊,但這就相當于要把裝修完畢的房子拆除重新裝修,倒不如一開始就去毛胚房做全新的裝修。

3.Django的賣點是超高的開發(fā)效率,其性能擴展有限;采用Django的項目,在流量達到一定規(guī)模后,都需要對其進行重構,才能滿足性能的要求。

4.Django適用的是中小型的網站,或者是作為大型網站快速實現產品雛形的工具。

5.Django模板的設計哲學是徹底的將代碼、樣式分離; Django從根本上杜絕在模板中進行編碼、處理數據的可能。

2.WSGI 和 uWSGI在django中的作用

WSGI

WSGI是一種WEB服務器  ==網關接口==。 是一個Web服務器(如nginx)與應用服務器(如uWSGI)通信的一種規(guī)范(協(xié)議)。

在生產環(huán)境中使用WSGI作為python web的服務器。Python Web服務器網關接口,是Python應用程序或框架和Web服務器之間的一種接口,被廣泛接受。WSGI沒有官方的實現, 因為WSGI更像一個協(xié)議,只要遵照這些協(xié)議,WSGI應用(Application)都可以在任何服務器(Server)上運行。

uWSGI

uWSGI實現了WSGI的所有接口,是一個快速、自我修復、開發(fā)人員和系統(tǒng)管理員友好的服務器。uWSGI代碼完全用C編寫,效率高、性能穩(wěn)定。

uwsgi是一種線路協(xié)議而不是通信協(xié)議,在此常用于在uWSGI服務器與其他網絡服務器的數據通信。uwsgi協(xié)議是一個uWSGI服務器自有的協(xié)議,它用于定義傳輸信息的類型。

作用

Django 是一個 Web 框架,框架的作用在于處理 request 和 reponse,其他的不是框架所關心的內容。所以怎么部署 Django 不是 Django 所需要關心的。

Django 所提供的是一個開發(fā)服務器,這個開發(fā)服務器,沒有經過安全測試,而且使用的是 Python 自帶的 simple HTTPServer 創(chuàng)建的,在安全性和效率上都是不行的

而uWSGI 是一個全功能的 HTTP 服務器,他要做的就是把 HTTP 協(xié)議轉化成語言支持的網絡協(xié)議。比如把 HTTP 協(xié)議轉化成 WSGI 協(xié)議,讓 Python 可以直接使用。

uwsgi 是一種 uWSGI 的內部協(xié)議,使用二進制方式和其他應用程序進行通信。

3.什么是wsgi?

WSGI是Python在處理HTTP請求時,規(guī)定的一種處理方式。如一個HTTP Request過來了,那么就有一個相應的處理函數來進行處理和返回結果。WSGI就是規(guī)定這個處理函數的參數長啥樣的,它的返回結果是長啥樣的?至于該處理函數的名子和處理邏輯是啥樣的,那無所謂。簡單而言,WSGI就是規(guī)定了處理函數的輸入和輸出格式。

4.django請求的生命周期?

當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發(fā)給服務端

請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現在url之中.

url經過Django中的wsgi,再經過Django的中間件,最后url到過路由映射表,在路由中一條一條進行匹配,

一旦其中一條匹配成功就執(zhí)行對應的視圖函數,后面的路由就不再繼續(xù)匹配了.

視圖函數根據客戶端的請求查詢相應的數據.返回給Django,然后Django把客戶端想要的數據做為一個字符串返回給客戶端.

客戶端瀏覽器接收到返回的數據,經過渲染后顯示給用戶.

1.wsgi,請求封裝后交給web框架 (Flask、Django)    

2.中間件,對請求進行校驗或在請求對象中添加其他相關數據,例如:csrf、request.session     -

3.路由匹配 根據瀏覽器發(fā)送的不同url去匹配不同的視圖函數   

4.視圖函數,在視圖函數中進行業(yè)務邏輯的處理,可能涉及到:orm、templates => 渲染     -

5.中間件,對響應的數據進行處理。

6.wsgi,將響應的內容發(fā)送給瀏覽器。

5.列舉django的內置組件?

Admin是對model中對應的數據表進行增刪改查提供的組件

model組件:負責操作數據庫

form組件:1.生成HTML代碼2.數據有效性校驗3校驗信息返回并展示

ModelForm組件即用于數據庫操作,也可用于用戶請求的驗證

6.列舉django中間件的5個方法?以及django中間件的應用場景?

process_request : 請求進來時,權限認證

process_view : 路由匹配之后,能夠得到視圖函數

process_exception : 異常時執(zhí)行

process_template_responseprocess : 模板渲染時執(zhí)行

process_response : 請求有響應時執(zhí)行

7.簡述什么是FBV和CBV?

FBV和CBV本質是一樣的,基于函數的視圖叫做FBV,基于類的視圖叫做CBV

在python中使用CBV的優(yōu)點:

提高了代碼的復用性,可以使用面向對象的技術,比如Mixin(多繼承)

可以用不同的函數針對不同的HTTP方法處理,而不是通過很多if判斷,提高代碼可讀性

8.django的request對象是在什么時候創(chuàng)建的?

class WSGIHandler(base.BaseHandler):

-------request = self.request_class(environ)

請求走到WSGIHandler類的時候,執(zhí)行cell方法,將environ封裝成了request

9.如何給CBV的程序添加裝飾器?

from django.utils.decorators import method_decorator
        1、給方法加:
            @method_decorator(check_login)
            def post(self, request):
                ...
        2、給dispatch加:
            @method_decorator(check_login)
            def dispatch(self, request, *args, **kwargs):
                ...

給類加:

@method_decorator(check_login, name="get")
            @method_decorator(check_login, name="post")
            class HomeView(View):
                ...

10.列舉django orm 中所有的方法(QuerySet對象的所有方法)

<1> all():                  查詢所有結果 
  <2> filter(**kwargs):       它包含了與所給篩選條件相匹配的對象。獲取不到返回None
  <3> get(**kwargs):          返回與所給篩選條件相匹配的對象,返回結果有且只有一個。
                              如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
  <4> exclude(**kwargs):      它包含了與所給篩選條件不匹配的對象
  <5> order_by(*field):       對查詢結果排序
  <6> reverse():              對查詢結果反向排序 
  <8> count():                返回數據庫中匹配查詢(QuerySet)的對象數量。 
  <9> first():                返回第一條記錄 
  <10> last():                返回最后一條記錄 
  <11> exists():              如果QuerySet包含數據,就返回True,否則返回False
  <12> values(*field):        返回一個ValueQuerySet——一個特殊的QuerySet,運行后得到的
                              并不是一系 model的實例化對象,而是一個可迭代的字典序列
  <13> values_list(*field):   它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列
  <14> distinct():            從返回結果中剔除重復紀錄

11.select_related和prefetch_related的區(qū)別?

前提:有外鍵存在時,可以很好的減少數據庫請求的次數,提高性能

select_related通過多表join關聯(lián)查詢,一次性獲得所有數據,只執(zhí)行一次SQL查詢

prefetch_related分別查詢每個表,然后根據它們之間的關系進行處理,執(zhí)行兩次查詢

12.filter和exclude的區(qū)別?

兩者取到的值都是QuerySet對象,filter選擇滿足條件的,exclude:排除滿足條件的.

13.列舉django orm中三種能寫sql語句的方法

1.使用execute執(zhí)行自定義的SQL

 直接執(zhí)行SQL語句(類似于pymysql的用法)
        # 更高靈活度的方式執(zhí)行原生SQL語句
        from django.db import connection
        cursor = connection.cursor()
        cursor.execute("SELECT DATE_FORMAT(create_time, '%Y-%m') FROM blog_article;")
        ret = cursor.fetchall()
        print(ret)

2.使用extra方法 :queryset.extra(select={"key": "原生的SQL語句"})

3.使用raw方法

執(zhí)行原始sql并返回模型

依賴model多用于查詢

14.values和values_list的區(qū)別?

values : queryset類型的列表中是字典
values_list : queryset類型的列表中是元組

15.cookie和session的區(qū)別:

cookie:

cookie是保存在瀏覽器端的鍵值對,可以用來做用戶認證

session:

將用戶的會話信息保存在服務端,key值是隨機產生的字符串,value值是session的內容

依賴于cookie將每個用戶的隨機字符串保存到用戶瀏覽器上

Django中session默認保存在數據庫中:django_session表

flask,session默認將加密的數據寫在用戶的cookie中

16.如何使用django orm批量創(chuàng)建數據?

objs=[models.Book(title="圖書{}".format(i+15)) for i in range(100)]
models.Book.objects.bulk_create(objs)

17.django的Form組件中,如果字段中包含choices參數,請使用兩種方式實現數據源實時更新

1.重寫構造函數

def__init__(self, *args, **kwargs):
     super().__init__(*args, **kwargs)
     self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name")

2.利用ModelChoiceField字段,參數為queryset對象

authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())//多選

18.django的Model中的ForeignKey字段中的on_delete參數有什么作用?

刪除關聯(lián)表中的數據時,當前表與其關聯(lián)的field的操作

django2.0之后,表與表之間關聯(lián)的時候,必須要寫on_delete參數,否則會報異常

19.django的模板中自定義filter和simple_tag的區(qū)別?

自定義filter:{{ 參數1|filter函數名:參數2 }}

1.可以與if標簽來連用

2.自定義時需要寫兩個形參

  例子:自定義filter
            1. 在app01下創(chuàng)建一個叫templatetags的Python包
            2. 在templatetags的文件夾下創(chuàng)建py文件  myfilters
            3. 在py文件中寫代碼
                from django import template
                register = template.Library()
                
                @register.filter
                def add_sb(value,arg='aaa'):
                    return "{}_sb_{}".formart(value,arg)             
                @register.filter(name='sb')
                def add_sb(value,arg='aaa'):
                    return "{}_sb_{}".formart(value,arg)     
            4. 使用自定義filter
                {% load myfilters %}
                {{ name|add_sb:'xxx'}}
                {{ name|sb:'xxx'}}
simple_tag:{% simple_tag函數名 參數1 參數2 %}

1.可以傳多個參數,沒有限制

2.不能與if標簽來連用

例子:自定義simpletag

創(chuàng)建

1 、在app01中創(chuàng)建一個名字是templatetags的包,
        2、在包中創(chuàng)建一個py文件
        3、在py文件中導入
              from django import template
              register = template.Library()
        4、寫函數
              @register.simple_tag(name="plus")
              def plus(a,b,c):
                  return '{}+{}+{}'.format(a,b,c)
        5、加裝飾器@register.simple_tag(name="plus")

使用

1、導入

            {% load mytag %}

2、使用

           {% plus 1 2 3 %}

20.django中csrf的實現機制

第一步:django第一次響應來自某個客戶端的請求時,后端隨機產生一個token值,把這個token保存在SESSION狀態(tài)中;同時,后端把這個token放到cookie中交給前端頁面;

第二步:下次前端需要發(fā)起請求(比如發(fā)帖)的時候把這個token值加入到請求數據或者頭信息中,一起傳給后端;Cookies:{csrftoken:xxxxx}

第三步:后端校驗前端請求帶過來的token和SESSION里的token是否一致。

21.基于django使用ajax發(fā)送post請求時,都可以使用哪種方法攜帶csrf token?

1.后端將csrftoken傳到前端,發(fā)送post請求時攜帶這個值發(fā)送

data: {
        csrfmiddlewaretoken: '{{ csrf_token }}'
  },

2.獲取form中隱藏標簽的csrftoken值,加入到請求數據中傳給后端

data: {
          csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()
     },

3.cookie中存在csrftoken,將csrftoken值放到請求頭中

headers:{ "X-CSRFtoken":$.cookie("csrftoken")}

22.Django本身提供了runserver,為什么不能用來部署?(runserver與uWSGI的區(qū)別)

1.runserver方法是調試 Django 時經常用到的運行方式,它使用Django自帶的

WSGI Server 運行,主要在測試和開發(fā)中使用,并且 runserver 開啟的方式也是單進程 。

2.uWSGI是一個Web服務器,它實現了WSGI協(xié)議、uwsgi、http 等協(xié)議。注意uwsgi是一種通信協(xié)議,而uWSGI是實現uwsgi協(xié)議和WSGI協(xié)議的 Web 服務器。uWSGI具有超快的性能、低內存占用和多app管理等優(yōu)點,并且搭配著Nginx就是一個生產環(huán)境了,能夠將用戶訪問請求與應用 app 隔離開,實現真正的部署 。相比來講,支持的并發(fā)量更高,方便管理多進程,發(fā)揮多核的優(yōu)勢,提升性能。

23.Django如何實現websocket?

django實現websocket官方推薦大家使用channels。channels通過升級http協(xié)議 升級到websocket協(xié)議。

以上是“Django面試常見的一些問題”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI