django面試題(21道)
1、什麼是wsgi?
WSGI是Python在處理HTTP請求時,規定的一種處理方式。如一個HTTP Request過來了,那麼就有一個相應的處理函式來進行處理和返回結果。WSGI就是規定這個處理函式的引數長啥樣的,它的返回結果是長啥樣的?至於該處理函式的名子和處理邏輯是啥樣的,那無所謂。簡單而言,WSGI就是規定了處理函式的輸入和輸出格式。
2、django請求的生命週期?
-
. 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端
請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現在url之中. -
. url經過Django中的wsgi,再經過Django的中介軟體,最後url到過路由對映表,在路由中一條一條進行匹配,
一旦其中一條匹配成功就執行對應的檢視函式,後面的路由就不再繼續匹配了. - . 檢視函式根據客戶端的請求查詢相應的資料.返回給Django,然後Django把客戶端想要的資料做為一個字串返回給客戶端.
- . 客戶端瀏覽器接收到返回的資料,經過渲染後顯示給使用者.
3、列舉django的內建元件?
- .Admin是對model中對應的資料表進行增刪改查提供的元件
- .model元件:負責操作資料庫
- .form元件:1.生成HTML程式碼2.資料有效性校驗3校驗資訊返回並展示
- .ModelForm元件即用於資料庫操作,也可用於使用者請求的驗證
4、列舉django中介軟體的5個方法?以及django中介軟體的應用場景?
- .process_request : 請求進來時,許可權認證
- .process_view : 路由匹配之後,能夠得到檢視函式
- .process_exception : 異常時執行
- .process_template_responseprocess : 模板渲染時執行
- .process_response : 請求有響應時執行
5、簡述什麼是FBV和CBV?
FBV和CBV本質是一樣的,基於函式的檢視叫做FBV,基於類的檢視叫做CBV
在python中使用CBV的優點:
- .提高了程式碼的複用性,可以使用面嚮物件的技術,比如Mixin(多繼承)
- .可以用不同的函式針對不同的HTTP方法處理,而不是通過很多if判斷,提高程式碼可讀性
6、django的request物件是在什麼時候建立的?
class WSGIHandler(base.BaseHandler):
-------request = self.request_class(environ)
請求走到WSGIHandler類的時候,執行cell
方法,將environ封裝成了request
7、如何給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): ... 3、給類加: @method_decorator(check_login, name="get") @method_decorator(check_login, name="post") class HomeView(View): ...
8、列舉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():從返回結果中剔除重複紀錄
9、select_related和prefetch_related的區別?
前提:有外來鍵存在時,可以很好的減少資料庫請求的次數,提高效能
select_related通過多表join關聯查詢,一次性獲得所有資料,只執行一次SQL查詢
prefetch_related分別查詢每個表,然後根據它們之間的關係進行處理,執行兩次查詢
10、filter和exclude的區別?
兩者取到的值都是QuerySet物件,filter選擇滿足條件的,exclude:排除滿足條件的.
11、列舉django orm中三種能寫sql語句的方法
1.使用execute執行自定義的SQL 直接執行SQL語句(類似於pymysql的用法) # 更高靈活度的方式執行原生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方法 1.執行原始sql並返回模型 2.依賴model多用於查詢
12、values和values_list的區別?
- values : queryset型別的列表中是字典
- values_list : queryset型別的列表中是元組
13、cookie和session的區別:
-
.cookie:
cookie是儲存在瀏覽器端的鍵值對,可以用來做使用者認證 -
.session:
將使用者的會話資訊儲存在服務端,key值是隨機產生的字串,value值是session的內容
依賴於cookie將每個使用者的隨機字串儲存到使用者瀏覽器上 - Django中session預設儲存在資料庫中:django_session表
- flask,session預設將加密的資料寫在使用者的cookie中
14、如何使用django orm批量建立資料?
objs=[models.Book(title="圖書{}".format(i+15)) for i in range(100)] models.Book.objects.bulk_create(objs)
15、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())//多選
16、django的Model中的ForeignKey欄位中的on_delete引數有什麼作用?
- 刪除關聯表中的資料時,當前表與其關聯的field的操作
- django2.0之後,表與表之間關聯的時候,必須要寫on_delete引數,否則會報異常
17、django的模板中自定義filter和simple_tag的區別?
-
自定義filter:{{ 引數1|filter函式名:引數2 }}
1.可以與if標籤來連用
2.自定義時需要寫兩個形參
例子:自定義filter 1. 在app01下建立一個叫templatetags的Python包 2. 在templatetags的資料夾下建立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 建立 1 、在app01中建立一個名字是templatetags的包, 2、在包中建立一個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 %}
18、django中csrf的實現機制
- 第一步:django第一次響應來自某個客戶端的請求時,後端隨機產生一個token值,把這個token儲存在SESSION狀態中;同時,後端把這個token放到cookie中交給前端頁面;
- 第二步:下次前端需要發起請求(比如發帖)的時候把這個token值加入到請求資料或者頭資訊中,一起傳給後端;Cookies:{csrftoken:xxxxx}
- 第三步:後端校驗前端請求帶過來的token和SESSION裡的token是否一致。
19、基於django使用ajax傳送post請求時,都可以使用哪種方法攜帶csrf token?
- 1.後端將csrftoken傳到前端,傳送post請求時攜帶這個值傳送
data: { csrfmiddlewaretoken: '{{ csrf_token }}' },
- 2.獲取form中隱藏標籤的csrftoken值,加入到請求資料中傳給後端
data: { csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() },
- 3.cookie中存在csrftoken,將csrftoken值放到請求頭中
headers:{ "X-CSRFtoken":$.cookie("csrftoken")}
20、Django本身提供了runserver,為什麼不能用來部署?(runserver與uWSGI的區別)
-
1.runserver方法是除錯 Django 時經常用到的執行方式,它使用Django自帶的
WSGI Server 執行,主要在測試和開發中使用,並且 runserver 開啟的方式也是單程序 。 - 2.uWSGI是一個Web伺服器,它實現了WSGI協議、uwsgi、http 等協議。注意uwsgi是一種通訊協議,而uWSGI是實現uwsgi協議和WSGI協議的 Web 伺服器。uWSGI具有超快的效能、低記憶體佔用和多app管理等優點,並且搭配著Nginx就是一個生產環境了,能夠將使用者訪問請求與應用 app 隔離開,實現真正的部署 。相比來講,支援的併發量更高,方便管理多程序,發揮多核的優勢,提升效能。
21、Django如何實現websocket?
- django實現websocket官方推薦大家使用channels。channels通過升級http協議 升級到websocket協議。保證實時通訊。也就是說,我們完全可以用channels實現我們的即時通訊。而不是使用長輪詢和計時器方式來保證偽實時通訊。他通過改造django框架,使django既支援http協議又支援websocket協議。
- 官方文件地址:ofollow,noindex">https://channels.readthedocs.io/en/stable/