學(xué)AI,好工作 就找北大青鳥
關(guān)注小青 聽課做題,輕松學(xué)習(xí)
周一至周日
4000-9696-28

【轉(zhuǎn)載】python面試基礎(chǔ)知識(三) Django部分

來源:北大青鳥總部 2019年11月20日 10:22

摘要: python面試基礎(chǔ)知識(三) Django部分

最近,小編在整理python面試基礎(chǔ)知識,看了很多博客、文章和咨詢了一些大廠公司大牛。了解到,在python面試的時候,不僅要求你有項目經(jīng)驗,還要考試代碼呢!今天,小編和大家分享一下python面試基礎(chǔ)知識,希望幫忙大家找到理想的工作!

1570499953(1).jpg

1、Django請求的生命周期

 a. wsgi, 創(chuàng)建socket服務(wù)端,用于接收用戶請求并對請求進行初次封裝。

 b. 中間件,對所有請求到來之前,響應(yīng)之前定制一些操作。

 c. 路由匹配,在url和視圖函數(shù)對應(yīng)關(guān)系中,根據(jù)當(dāng)前請求url找到相應(yīng)的函數(shù)。

 d. 執(zhí)行視圖函數(shù),業(yè)務(wù)處理【通過ORM去數(shù)據(jù)庫中獲取數(shù)據(jù),再去拿到模板,然后將數(shù)據(jù)和模板進行渲染】

e. 再經(jīng)過所有中間件。

 f. 通過wsgi將響應(yīng)返回給用戶。

2、簡述django對http請求的執(zhí)行流程。

一個 HTTP 請求,首先被轉(zhuǎn)化成一個 HttpRequest 對象,然后該對象被傳遞給

Request 中間件處理,如果該中間件返回了Response,則直接傳遞給

Response 中間件做收尾處理。否則的話 Request 中間件將訪問 URL 配置,確

定哪個 view 來處理,在確定了哪個 view 要執(zhí)行,但是還沒有執(zhí)行該 view 的時

候,系統(tǒng)會把 request 傳遞給 View 中間件處理器進行處理,如果該中間件返回

Response,那么該Response 直接被傳遞給 Response 中間件進行后續(xù)處

 理,否則將執(zhí)行確定的 View 函數(shù)處理并返回 Response,在這個過程中如果引

發(fā)了異常并拋出,會被 Exception 中間件處理器進行處理。

3、簡述Django的orm

ORM,全拼Object-Relation Mapping,意為對象-關(guān)系映射

實現(xiàn)了數(shù)據(jù)模型與數(shù)據(jù)庫的解耦,通過簡單的配置就可以輕松更換數(shù)據(jù)庫,而不需要修改代碼只需要面

向?qū)ο缶幊?/span>,orm操作本質(zhì)上會根據(jù)對接的數(shù)據(jù)庫引擎,翻譯成對應(yīng)的sql語句,所有使用Django開發(fā)的項

目無需關(guān)心程序底層使用的是MySQL、Oracle、sqlite....,如果數(shù)據(jù)庫遷移,只需要更換Django的數(shù)據(jù)

庫引擎即可

4、Django里QuerySet的get和filter方法的區(qū)別?

django的get方法是從數(shù)據(jù)庫的取得一個匹配的結(jié)果,返回一個對象,如果記錄不存在的話,它會報錯。

django的filter方法是從數(shù)據(jù)庫的取得匹配的結(jié)果,返回一個對象列表,如果記錄不存在的話,它會返回[]。

get

只能取出一條數(shù)據(jù),如果滿足條件的數(shù)據(jù)有多條,拋出異常

沒有數(shù)據(jù),也會拋出異常

filter

如果有數(shù)據(jù),就返回QuerySet(類似于可以遍歷的數(shù)組) 如果沒有數(shù)據(jù),返回empty(不會拋異常)

5、簡述Django下的(內(nèi)建的)緩存機制。

緩存是將一些常用的數(shù)據(jù)保存內(nèi)存或者memcache中,在一定的時間內(nèi)有人來訪問這些數(shù)據(jù)時,則不再去

執(zhí)行數(shù)據(jù)庫及渲染等操作,而是直接從內(nèi)存或memcache的緩存中去取得數(shù)據(jù),然后返回給用戶.django提

供了6中內(nèi)存緩存機制,分別為:

開發(fā)調(diào)試緩存(為開發(fā)調(diào)試使用,實際上不使用任何操作);

內(nèi)存緩存(將緩存內(nèi)容緩存到內(nèi)存中);

文件緩存(將緩存內(nèi)容寫到文件 );

數(shù)據(jù)庫緩存(將緩存內(nèi)容存到數(shù)據(jù)庫);

memcache緩存(包含兩種模塊,python-memcached或pylibmc.)。

以上緩存均提供了三種粒度的應(yīng)用。

6、django中model的slugfeild類型字段有什么用途?

只包含字母、數(shù)字、下劃線和連接符,通常用于urls

7、Python中@staticmethod和@classmethod的區(qū)別。

在類中總共有三種方法:普通方法(需要參數(shù),使用時默認(rèn)將類的實例對象傳進去,類調(diào)用的時候需要

傳遞實例對象),@staticmethod裝飾的靜態(tài)方法與普通函數(shù)相同(實例和類均可調(diào)用,沒有默認(rèn)的參

數(shù)傳遞進去),@classmethod裝飾的類方法(需要參數(shù),使用時將調(diào)用的類傳進去,或者實例對象調(diào)

用時是將實例對應(yīng)的類傳進去。

8、什么是socket?

socket是在應(yīng)用層和傳輸層之間的一個抽象層,它把TCP/IP層復(fù)雜的操作抽象為

幾個簡單的接口供應(yīng)用層調(diào)用以實現(xiàn)進程在網(wǎng)絡(luò)中通信。

9、Web開發(fā)中,session和cookie的作用與區(qū)別。

Cookie概念

在瀏覽某些 網(wǎng)站 ,這些網(wǎng)站會把 一些數(shù)據(jù)存在 客戶端 , 用于使用網(wǎng)站 等跟蹤用戶實現(xiàn)用戶自定

功能.

是否設(shè)置過期時間:

 如果不設(shè)置 過期時間,則表示這個 Cookie生命周期為 瀏覽器會話期間 , 只要關(guān)閉瀏覽器,cookie就消失了.

 這個生命期為瀏覽會話期的cookie,就是會話Cookie;

    存儲:    一般保存在 內(nèi)存,不在硬盤;

    如果設(shè)置了過期時間, 瀏覽器會把cookie保存在硬盤上,關(guān)閉再打開瀏覽器, 這些cookie 依然有效直到 超

 過的設(shè)置過期時間;

          Session的概念

        作用:實現(xiàn)網(wǎng)頁之間數(shù)據(jù)傳遞,是一個存儲在服務(wù)器端的對象集合。

        原理:當(dāng)用戶請求一個Asp.net頁面時,系統(tǒng)將自動創(chuàng)建一個Session;退出應(yīng)用程序或關(guān)閉服務(wù)器

        時,該Session撤銷。系統(tǒng)在創(chuàng)建Session時將為其分配一個長長的字符串標(biāo)識,以實現(xiàn)對Session進

        行管理與跟蹤。

     cookie 和session 的區(qū)別:  

    1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上.

           簡單的說,當(dāng)你登錄一個網(wǎng)站的時候,如果web服務(wù)器端使用的是session,那么所有的數(shù)據(jù)都保存

           在服務(wù)器上面,

    

    客戶端每次請求服務(wù)器的時候會發(fā)送 當(dāng)前會話的session_id,服務(wù)器根據(jù)當(dāng)前session_id判斷相應(yīng)的用

    戶數(shù)據(jù)標(biāo)志,以確定用戶是否登錄,或具有某種權(quán)限。

    

    由于數(shù)據(jù)是存儲在服務(wù)器 上面,所以你不能偽造,但是如果你能夠獲取某個登錄用戶的session_id,用

    特殊的瀏覽器偽造該用戶的請求也是能夠成功的。

    session_id是服務(wù) 器和客戶端鏈接時候隨機分配的,一般來說是不會有重復(fù),但如果有大量的并發(fā)請

    求,也不是沒有重復(fù)的可能性,我曾經(jīng)就遇到過一次。

    登錄某個網(wǎng)站,開始顯示的 是自己的信息,等一段時間超時了,一刷新,居然顯示了別人的信息。

    Session是由應(yīng)用服務(wù)器維持的一個服務(wù)器端的存儲空間,用戶在連接服務(wù)器時,會由服務(wù)器生成一個

    唯一的SessionID,用該SessionID 為標(biāo)識符來存取服務(wù)器端的Session存儲空間。而SessionID這一數(shù)據(jù)

    則是保存到客戶端,用Cookie保存的,用戶提交頁面時,會將這一 SessionID提交到服務(wù)器端,來存取

    Session數(shù)據(jù)。這一過程,是不用開發(fā)人員干預(yù)的。所以一旦客戶端禁用Cookie,那么Session也會失

    效。

    2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙考慮到安全應(yīng)當(dāng)使用

    session。

    3、session會在一定時間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會比較占用你服務(wù)器的性能考慮到減輕服務(wù)

    器性能方面,應(yīng)當(dāng)使用COOKIE。

    4、單個cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。(Session對

    象沒有對存儲的數(shù)據(jù)量的限制,其中可以保存更為復(fù)雜的數(shù)據(jù)類型)

10、Web開發(fā)中有哪些技術(shù)手段防止SQL注入?

1.使用預(yù)編譯綁定變量的SQL語句

2.嚴(yán)格加密處理用戶的機密信息

3.不要隨意開啟生產(chǎn)環(huán)境中Webserver的錯誤顯示

4.使用正則表達(dá)式過濾傳入的參數(shù)

5.字符串過濾

6.檢查是否包函非法字符

11、如何查看占用8080端口的是什么進程?

windows查看端口占用

windows命令行窗口下執(zhí)行:

netstat -aon|findstr "8080"

linux系統(tǒng)

先使用 netstat命令,再用 ps命令

執(zhí)行命令: netstat -anp|grep 8080

輸出結(jié)果: tcp 0 0 :::8080 :::* LISTEN 12006/java

執(zhí)行命令: ps -ef | grep 12006

12、談?wù)凞jango中的中間件。

django.middleware.security.SecurityMiddleware’

一些安全設(shè)置,比如XSS腳本過濾。

django.contrib.sessions.middleware.SessionMiddleware

session支持中間件,加入這個中間件,會在數(shù)據(jù)庫中生成一個django_session的表。

django.middleware.common.CommonMiddleware

通用中間件,會處理一些URL,比如baidu.com會自動的處理成www.baidu.com。比如/blog/111會處理

/blog/111/自動加上反斜杠

django.middleware.csrf.CsrfViewMiddleware

跨域請求偽造中間件。加入這個中間件,在提交表單的時候會必須加入csrf_token,cookie中也會生成一

個名叫csrftoken的值,也會在header中加入一個HTTP_X_CSRFTOKEN的值來放置CSRF攻擊

django.contrib.auth.middleware.AuthenticationMiddleware

用戶授權(quán)中間件。他會在每個HttpRequest對象到達(dá)view之前添加當(dāng)前登錄用戶的user屬性,也就是你可

以在view中通過request訪問user

django.contrib.messages.middleware.MessageMiddleware

消息中間件。展示一些后臺信息給前端頁面。如果需要用到消息,還需要在INSTALLED_APPS中添加

django.contrib.message才能有效。如果不需要,可以把這兩個都刪除

django.middleware.clickjacking.XFrameOptionsMiddleware

防止通過瀏覽器頁面跨Frame出現(xiàn)clickjacking(欺騙點擊)攻擊出現(xiàn)。

13、談?wù)凜SRF原理

CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/

sessionriding,縮寫為:CSRF/XSRF。

你這可以這么理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義發(fā)送惡意請求。CSRF能夠做的事情

包括:以你名義發(fā)送郵件,發(fā)消息,盜取你的賬號,甚至于購買商品,虛擬貨幣轉(zhuǎn)賬......造成的問題包

括:個人隱私泄露以及財產(chǎn)安全。

要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:

  1.登錄受信任網(wǎng)站A,并在本地生成Cookie。

  2.在不登出A的情況下,訪問危險網(wǎng)站B。

14、談?wù)凴ESTful規(guī)范

Representational State Transfer "表現(xiàn)層狀態(tài)轉(zhuǎn)化"

restful其實就是一套編寫接口的協(xié)議,協(xié)議規(guī)定如何編寫以及如何設(shè)置返回值、狀態(tài)碼等信息。

restful: 給用戶一個url,根據(jù)method不同在后端做不同的處理,比如:post 創(chuàng)建數(shù)據(jù)、get獲取數(shù)據(jù)、put

patch修改數(shù)據(jù)、delete刪除數(shù)據(jù)。

1)每一個URI代表一種資源;

2)客戶端和服務(wù)器之間,傳遞這種資源的某種表現(xiàn)層;

3)客戶端通過四個HTTP動詞,對服務(wù)器端資源進行操作,實現(xiàn)"表現(xiàn)層狀態(tài)轉(zhuǎn)化"。

我們常用的狀態(tài)碼:

200   請求成功

301   永久重定向

302   臨時重定向   

403   權(quán)限問題

404   找不到頁面

500   服務(wù)器問題

15、Django中FBV與CBV

FBV(function base views) 就是在視圖里使用函數(shù)處理請求。

CBV(class base views) 就是在視圖里使用類處理請求。

如果我們要寫一個處理GET方法的view,用函數(shù)寫的話是下面這樣。

from django.http import HttpResponse

def my_view(request):

     if request.method == 'GET':

            return HttpResponse('OK')

如果用class-based view寫的話,就是下面這樣

from django.http import HttpResponse

from django.views import View

class MyView(View):

      def get(self, request):

            return HttpResponse('OK')

Django的url是將一個請求分配給可調(diào)用的函數(shù)的,而不是一個class。針對這個問題,class-based view提

供了一個as_view()靜態(tài)方法(也就是類方法),

url中,就這么寫:

# urls.py

from django.conf.urls import url

from myapp.views import MyView

urlpatterns = [

     url(r'^index/$', MyView.as_view()),]

16、談?wù)凞jango REST freamwork

自動生成符合 RESTful 規(guī)范的 API

支持 OPTION、HEAD、POST、GET、PATCH、PUT、DELETE

根據(jù) Content-Type 來動態(tài)的返回數(shù)據(jù)類型(如 text、json)

Django Rest framework 的流程大概是這樣的

1.建立 Models

2.依靠 Serialiers 將數(shù)據(jù)庫取出的數(shù)據(jù) Parse 為 API 的數(shù)據(jù)(可用于返回給客戶端,也可用于瀏覽器

顯示)

3.ViewSet 是一個 views 的集合,根據(jù)客戶端的請求(GET、POST等),返回 Serialiers 處理的數(shù)據(jù)

權(quán)限 Premissions 也在這一步做處理

4.ViewSet 可在 Routers 進行注冊,注冊后會顯示在 Api Root 頁上

5.在 urls 里注冊 ViewSet 生成的 view,指定監(jiān)聽的 url

17、對Django的認(rèn)識?

#1.Django是走大而全的方向,它最出名的是其全自動化的管理后臺:只需要使用起ORM,做簡單的對象

定義,它就能自動生成數(shù)據(jù)庫結(jié)構(gòu)、以及全功能的管理后臺。

#2.Django內(nèi)置的ORM跟框架內(nèi)的其他模塊耦合程度高。

#應(yīng)用程序必須使用Django內(nèi)置的ORM,否則就不能享受到框架內(nèi)提供的種種基于其ORM的便利;

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

胚房做全新的裝修。

#3.Django的賣點是超高的開發(fā)效率,其性能擴展有限;采用Django的項目,在流量達(dá)到一定規(guī)模后,都

需要對其進行重構(gòu),才能滿足性能的要求。

#4.Django適用的是中小型的網(wǎng)站,或者是作為大型網(wǎng)站快速實現(xiàn)產(chǎn)品雛形的工具。

#5.Django模板的設(shè)計哲學(xué)是徹底的將代碼、樣式分離; Django從根本上杜絕在模板中進行編碼、處理數(shù)

據(jù)的可能。

18、Django 、Flask、Tornado的對比

#1.Django走的是大而全的方向,開發(fā)效率高。它的MTV框架,自帶的ORM,admin后臺管理,自帶的sqlite數(shù)據(jù)

庫和開發(fā)測試用的服務(wù)器

#給開發(fā)者提高了超高的開發(fā)效率

#2.Flask是輕量級的框架,自由,靈活,可擴展性很強,核心基于Werkzeug WSGI工具和jinja2模板引擎

#3.Tornado走的是少而精的方向,性能優(yōu)越。它最出名的是異步非阻塞的設(shè)計方式

#Tornado的兩大核心模塊:

#    1.iostraem:對非阻塞式的socket進行簡單的封裝

#    2.ioloop:對I/O多路復(fù)用的封裝,它實現(xiàn)了一個單例

19、什么是wsgi,uwsgi,uWSGI?

#WSGI:

#    web服務(wù)器網(wǎng)關(guān)接口,是一套協(xié)議。用于接收用戶請求并將請求進行初次封裝,然后將請求交給web框架

#    實現(xiàn)wsgi協(xié)議的模塊:

#        1.wsgiref,本質(zhì)上就是編寫一個socket服務(wù)端,用于接收用戶請求(django)

#        2.werkzeug,本質(zhì)上就是編寫一個socket服務(wù)端,用于接收用戶請求(flask)

#uwsgi:

#    與WSGI一樣是一種通信協(xié)議,它是uWSGI服務(wù)器的獨占協(xié)議,用于定義傳輸信息的類型

#uWSGI:

#    是一個web服務(wù)器,實現(xiàn)了WSGI協(xié)議,uWSGI協(xié)議,http協(xié)議,

20、django請求的生命周期?

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

#2.中間件,對請求進行校驗或在請求對象中添加其他相關(guān)數(shù)據(jù),例如:csrf、request.session     -

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

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

#5.中間件,對響應(yīng)的數(shù)據(jù)進行處理。

#6.wsgi,將響應(yīng)的內(nèi)容發(fā)送給瀏覽器。

21、簡述什么是FBV和CBV?

#FBV和CBV本質(zhì)是一樣的

#基于函數(shù)的視圖叫做FBV,基于類的視圖叫做CBV

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

#1.提高了代碼的復(fù)用性,可以使用面向?qū)ο蟮募夹g(shù),比如Mixin(多繼承)

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

22、如何給CBV的程序添加裝飾器?

#引入method_decorator模塊

#1.直接在類上加裝飾器

#@method_decorator(test,name='dispatch')

#class Loginview(View):

#    pass

#2.直接在處理的函數(shù)前加裝飾器

#@method_decorator(test)

#    def post(self,request,*args,**kwargs):pass

以上,就是python面試基礎(chǔ)知識,小編還會陸續(xù)更新哦!希望大家都能找到合適的工作!

————————————————

版權(quán)聲明:本文為CSDN博主「單車欲問邊」的原創(chuàng)文章


熱門班型時間
人工智能就業(yè)班 即將爆滿
AI應(yīng)用線上班 即將爆滿
UI設(shè)計全能班 即將爆滿
數(shù)據(jù)分析綜合班 即將爆滿
軟件開發(fā)全能班 爆滿開班
網(wǎng)絡(luò)安全運營班 爆滿開班
報名優(yōu)惠
免費試聽
課程資料
官方微信
返回頂部
培訓(xùn)課程 熱門話題 站內(nèi)鏈接