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

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

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

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

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

1570499953(1).jpg

1、Django請(qǐng)求的生命周期

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

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

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

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

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

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

2、簡(jiǎn)述django對(duì)http請(qǐng)求的執(zhí)行流程。

一個(gè) HTTP 請(qǐng)求,首先被轉(zhuǎn)化成一個(gè) HttpRequest 對(duì)象,然后該對(duì)象被傳遞給

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

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

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

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

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

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

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

3、簡(jiǎn)述Django的orm

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

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

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

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

庫引擎即可

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

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

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

get

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

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

filter

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

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

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

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

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

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

內(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ù),使用時(shí)默認(rèn)將類的實(shí)例對(duì)象傳進(jìn)去,類調(diào)用的時(shí)候需要

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

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

用時(shí)是將實(shí)例對(duì)應(yīng)的類傳進(jìn)去。

8、什么是socket?

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

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

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

Cookie概念

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

功能.

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

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

 這個(gè)生命期為瀏覽會(huì)話期的cookie,就是會(huì)話Cookie;

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

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

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

          Session的概念

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

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

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

        行管理與跟蹤。

     cookie 和session 的區(qū)別:  

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

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

           在服務(wù)器上面,

    

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

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

    

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

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

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

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

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

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

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

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

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

    效。

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

    session。

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

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

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

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

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

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

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

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

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

5.字符串過濾

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

11、如何查看占用8080端口的是什么進(jìn)程?

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支持中間件,加入這個(gè)中間件,會(huì)在數(shù)據(jù)庫中生成一個(gè)django_session的表。

django.middleware.common.CommonMiddleware

通用中間件,會(huì)處理一些URL,比如baidu.com會(huì)自動(dòng)的處理成www.baidu.com。比如/blog/111會(huì)處理

/blog/111/自動(dòng)加上反斜杠

django.middleware.csrf.CsrfViewMiddleware

跨域請(qǐng)求偽造中間件。加入這個(gè)中間件,在提交表單的時(shí)候會(huì)必須加入csrf_token,cookie中也會(huì)生成一

個(gè)名叫csrftoken的值,也會(huì)在header中加入一個(gè)HTTP_X_CSRFTOKEN的值來放置CSRF攻擊

django.contrib.auth.middleware.AuthenticationMiddleware

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

以在view中通過request訪問user

django.contrib.messages.middleware.MessageMiddleware

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

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

django.middleware.clickjacking.XFrameOptionsMiddleware

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

13、談?wù)凜SRF原理

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

sessionriding,縮寫為:CSRF/XSRF。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

200   請(qǐng)求成功

301   永久重定向

302   臨時(shí)重定向   

403   權(quán)限問題

404   找不到頁面

500   服務(wù)器問題

15、Django中FBV與CBV

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

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

如果我們要寫一個(gè)處理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是將一個(gè)請(qǐng)求分配給可調(diào)用的函數(shù)的,而不是一個(gè)class。針對(duì)這個(gè)問題,class-based view提

供了一個(gè)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

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

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

根據(jù) Content-Type 來動(dòng)態(tài)的返回?cái)?shù)據(jù)類型(如 text、json)

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

1.建立 Models

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

顯示)

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

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

4.ViewSet 可在 Routers 進(jìn)行注冊(cè),注冊(cè)后會(huì)顯示在 Api Root 頁上

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

17、對(duì)Django的認(rèn)識(shí)?

#1.Django是走大而全的方向,它最出名的是其全自動(dòng)化的管理后臺(tái):只需要使用起ORM,做簡(jiǎn)單的對(duì)象

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

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

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

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

胚房做全新的裝修。

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

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

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

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

據(jù)的可能。

18、Django 、Flask、Tornado的對(duì)比

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

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

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

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

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

#Tornado的兩大核心模塊:

#    1.iostraem:對(duì)非阻塞式的socket進(jìn)行簡(jiǎn)單的封裝

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

19、什么是wsgi,uwsgi,uWSGI?

#WSGI:

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

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

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

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

#uwsgi:

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

#uWSGI:

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

20、django請(qǐng)求的生命周期?

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

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

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

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

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

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

21、簡(jiǎn)述什么是FBV和CBV?

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

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

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

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

#2.可以用不同的函數(shù)針對(duì)不同的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ǔ)知識(shí),小編還會(huì)陸續(xù)更新哦!希望大家都能找到合適的工作!

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

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


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