Django重點及面試題

2022-12-21 21:00:29

Django

簡述python三大主流web框架

"""
django
	大而全,類似於航空母艦
	但是有時候過於笨重
flask
	小而精,類似於遊騎兵(單行程式碼就可以起一個flask服務)
	第三方元件很多,但是有時候也會受限於第三方
tornado
	非同步非阻塞
	速度非常快

SANIC
FASTAPI
...
"""

WSGI,ASGI跟wsgiref和uwsgi是什麼關係

WSGI、ASGI是協定,ASGI基於WSGI
wsgiref和uwsgi是實現該協定的功能模組

簡述無名有名分組

將匹配到的內容按位元置引數傳遞到檢視函數中
將匹配到的內容按關鍵字引數傳到到試圖函數中

簡述反向解析以及名稱空間

反向解析(本質)就是指通過一些方法,得到一個結果,該結果可以存取到對應的url並觸發檢視函數的執行
名稱空間就是解決多個app下出現相同的別名,反向解析不會自動識別應用的字首

反向解析的應用場景,是因為在軟體開發初期,url地址的路徑設計可能並不完美,後期需要進行調整,如果專案中很多地方使用了該路徑,一旦該路徑發生變化,就意味著所有使用該路徑的地方都需要進行修改,這是一個非常繁瑣的操作。
別名不能出現衝突!!!
# 別名如果發生衝突,未宣告名稱空間時,不同app下如果有相同的路由別名,反向解析會解析到最下面的app,會發生覆蓋

MTV與MVC模型

# MTV:Django號稱是MTV模型,其實是借鑑了MVC設計模式
Model:資料儲存層,處理所有資料相關的業務,和資料庫進行互動,並提供資料的增刪改查;
Template:模板層(也叫表現層)具體來處理頁面的顯示;
View:業務邏輯層,處理具體的業務邏輯,它的作用是連通Model 層和 Template 。
# MVC:其實django本質也是MVC
Modle 代表資料儲存層,是對資料表的定義和資料的增刪改查;
View 代表檢視層,是系統前端顯示部分,它負責顯示什麼和如何進行顯示;
Controller 代表控制層,負責根據從 View 層輸入的指令來檢索 Model 層的資料,並在該層編寫程式碼產生結果並輸出。

MTV 是 MVC 的一種細化,將原來 MVC 中的 V 層拿出來進行分離,檢視的顯示與如何顯示交給 Template 層,而 View 層更專注於實現業務邏輯。
其實在 Django 是有 Controller 層的,只不過它由框架本身來實現,所以我們不用關心它。Django 更關注於M、T 和 V。

# vue框架:MVVM模型

FBV和CBV的區別

FBV與CBV在路由匹配上本質是一樣的,都是路由對應函數的記憶體地址
CBV特點:能夠直接根據請求方式的不同自動匹配到對應的方法執行

簡述CBV流程

特點:能夠根據請求方式的不同自動匹配觸發對應的方法執行
CBV本質上也是FBV
自定義類呼叫並執行View中的as_view方法,View類中維護了一個列表,列表中存有8中請求方式,
as_view函數返回一個view函數,view函數返回一個dispatch函數,
dispatch函數中將傳入的請求方式變小寫,通過反射去列表中查詢是否有對應的請求方式,
有的話往後執行,沒有就返回資訊-不允許該請求方式

資料庫查詢優化

# only與defer	
# select_related與prefetch_related

"""
**queryset才有惰性查詢**
orm語句的特點:
    惰性查詢
        如果你僅僅只是書寫了orm語句 在後面根本沒有用到該語句所查詢出來的結果
        那麼orm會自動識別 直接不執行
"""
# only與defer
"""
only
	結果是一個列表套多個物件,這些物件預設只有only括號內的屬性
	但是也可以點選括號內沒有的屬性,點選括號內沒有的屬性需要額外的走資料庫操作
defer
	跟only剛好相反
		物件裡面唯獨沒有括號內指定的屬性
"""

# select_related與prefetch_related
"""
select_related內部的本質是聯表操作 inner join
	括號內只能放外來鍵欄位並且多對多不行
		括號內可以放多個外來鍵欄位
			select_related(外來鍵欄位1__外來鍵欄位2__外來鍵欄位3__...)
	將聯表之後的結果全部查詢出來封裝到物件裡面
	之後物件在點選表的欄位的時候都無需再走資料庫

prefetch_related內部本質是子查詢
	內部通過子查詢的方式將多張的表資料也封裝到物件中
	這樣使用者在使用的時候也是感覺不出來的
	
select_related主要用於一對一,一對多。prefetch_related主要用於多對多,也可用於一對多
上述兩種方式,在不同的場景下效率各有千秋
"""

Restful規範

https://www.cnblogs.com/hkwJsxl/p/16581564.html

Web伺服器和Web應用程式的區別

Web應用程式主要是完成web應用的業務邏輯的處理,Web伺服器則主要是應對外部請求的接收、響應和轉發。
需要使用web伺服器啟動執行,web應用程式才能被使用者存取到。
而django框架中,我們之所以只有一個web應用程式就跑起來了,是因為我們在終端執行了一個命令,
python manage.py runserver。這個命令啟動了django框架中內建提供的測試web伺服器。

請描述一個使用者端請求從發起到返回的過程(用django來描述);

使用者從瀏覽器發起一個請求,請求來了之後到wsgi解析封裝資料,
然後<請求攔截中介軟體>(process_request),
接著通過url路由匹配,分發到檢視,
有render的走中介軟體的process_view,
需要連線資料庫的連線資料庫,不需要連線資料庫的<響應攔截中介軟體>(process_response),
最後wsgi打包資料直接響應給瀏覽器。

請問Django projectDjango app之間有什麼區別和聯絡?

一個django專案可以有多個app,每個app處理不同的業務邏輯

請詳細說明Django中介軟體處理請求的流程(各個處理常式的執行順序)

django中介軟體中一共有五個方法:
	process_request
	process_response
	process_view
	process_exception
	process_template_response
主要常用為前兩個,當用戶發起請求時,會從上到下依次經過每一箇中介軟體,這個時候會觸發process_request函數,如果函數返回None,則繼續到view檢視中,返回HttpResponse響應物件則直接從當前中介軟體的process_reponse函數返回,正常情況下,檢視層處理完後,返回執行中介軟體process_response函數,最後返回給瀏覽器
process_view在process_request和process_response之間執行
process_exception在出錯時執行
process_template_response在檢視層中返回的物件有render方法時執行

請問django中如何進行路由分發操作?

在應用下建立一個urls.py,將關於該應用的邏輯處理放到url裡面,然後在總路由下匯入該應用的urls

get和filter操作出的結果集是什麼資料型別, 有什麼區別?

get取到的是模型類物件
filter取到的queryset集合

queryset集合可以包含多個模型類物件

create和save方法有什麼區別?

save方法要分為兩步,save才是最後運算元據庫的語句
create直接運算元據庫,一步到位