來源:北大青鳥總部 2019年11月20日 10:22
最近,小編在整理python面試基礎知識,看了很多博客、文章和咨詢了一些大廠公司大牛。了解到,在python面試的時候,不僅要求你有項目經驗,還要考試代碼呢!今天,小編和大家分享一下python面試基礎知識,希望幫忙大家找到理想的工作!
1、Django請求的生命周期
a. wsgi, 創(chuàng)建socket服務端,用于接收用戶請求并對請求進行初次封裝。
b. 中間件,對所有請求到來之前,響應之前定制一些操作。
c. 路由匹配,在url和視圖函數對應關系中,根據當前請求url找到相應的函數。
d. 執(zhí)行視圖函數,業(yè)務處理【通過ORM去數據庫中獲取數據,再去拿到模板,然后將數據和模板進行渲染】
e. 再經過所有中間件。
f. 通過wsgi將響應返回給用戶。
2、簡述django對http請求的執(zhí)行流程。
一個 HTTP 請求,首先被轉化成一個 HttpRequest 對象,然后該對象被傳遞給
Request 中間件處理,如果該中間件返回了Response,則直接傳遞給
Response 中間件做收尾處理。否則的話 Request 中間件將訪問 URL 配置,確
定哪個 view 來處理,在確定了哪個 view 要執(zhí)行,但是還沒有執(zhí)行該 view 的時
候,系統(tǒng)會把 request 傳遞給 View 中間件處理器進行處理,如果該中間件返回
了Response,那么該Response 直接被傳遞給 Response 中間件進行后續(xù)處
理,否則將執(zhí)行確定的 View 函數處理并返回 Response,在這個過程中如果引
發(fā)了異常并拋出,會被 Exception 中間件處理器進行處理。
3、簡述Django的orm
ORM,全拼Object-Relation Mapping,意為對象-關系映射
實現了數據模型與數據庫的解耦,通過簡單的配置就可以輕松更換數據庫,而不需要修改代碼只需要面
向對象編程,orm操作本質上會根據對接的數據庫引擎,翻譯成對應的sql語句,所有使用Django開發(fā)的項
目無需關心程序底層使用的是MySQL、Oracle、sqlite....,如果數據庫遷移,只需要更換Django的數據
庫引擎即可
4、Django里QuerySet的get和filter方法的區(qū)別?
django的get方法是從數據庫的取得一個匹配的結果,返回一個對象,如果記錄不存在的話,它會報錯。
django的filter方法是從數據庫的取得匹配的結果,返回一個對象列表,如果記錄不存在的話,它會返回[]。
get
只能取出一條數據,如果滿足條件的數據有多條,拋出異常
沒有數據,也會拋出異常
filter
如果有數據,就返回QuerySet(類似于可以遍歷的數組) 如果沒有數據,返回empty(不會拋異常)
5、簡述Django下的(內建的)緩存機制。
緩存是將一些常用的數據保存內存或者memcache中,在一定的時間內有人來訪問這些數據時,則不再去
執(zhí)行數據庫及渲染等操作,而是直接從內存或memcache的緩存中去取得數據,然后返回給用戶.django提
供了6中內存緩存機制,分別為:
開發(fā)調試緩存(為開發(fā)調試使用,實際上不使用任何操作);
內存緩存(將緩存內容緩存到內存中);
文件緩存(將緩存內容寫到文件 );
數據庫緩存(將緩存內容存到數據庫);
memcache緩存(包含兩種模塊,python-memcached或pylibmc.)。
以上緩存均提供了三種粒度的應用。
6、django中model的slugfeild類型字段有什么用途?
只包含字母、數字、下劃線和連接符,通常用于urls
7、Python中@staticmethod和@classmethod的區(qū)別。
在類中總共有三種方法:普通方法(需要參數,使用時默認將類的實例對象傳進去,類調用的時候需要
傳遞實例對象),@staticmethod裝飾的靜態(tài)方法與普通函數相同(實例和類均可調用,沒有默認的參
數傳遞進去),@classmethod裝飾的類方法(需要參數,使用時將調用的類傳進去,或者實例對象調
用時是將實例對應的類傳進去。
8、什么是socket?
socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為
幾個簡單的接口供應用層調用以實現進程在網絡中通信。
9、Web開發(fā)中,session和cookie的作用與區(qū)別。
Cookie概念
在瀏覽某些 網站 時,這些網站會把 一些數據存在 客戶端 , 用于使用網站 等跟蹤用戶實現用戶自定
義 功能.
是否設置過期時間:
如果不設置 過期時間,則表示這個 Cookie生命周期為 瀏覽器會話期間 , 只要關閉瀏覽器,cookie就消失了.
這個生命期為瀏覽會話期的cookie,就是會話Cookie;
存儲: 一般保存在 內存,不在硬盤;
如果設置了過期時間, 瀏覽器會把cookie保存在硬盤上,關閉再打開瀏覽器, 這些cookie 依然有效直到 超
過的設置過期時間;
Session的概念
作用:實現網頁之間數據傳遞,是一個存儲在服務器端的對象集合。
原理:當用戶請求一個Asp.net頁面時,系統(tǒng)將自動創(chuàng)建一個Session;退出應用程序或關閉服務器
時,該Session撤銷。系統(tǒng)在創(chuàng)建Session時將為其分配一個長長的字符串標識,以實現對Session進
行管理與跟蹤。
cookie 和session 的區(qū)別:
1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上.
簡單的說,當你登錄一個網站的時候,如果web服務器端使用的是session,那么所有的數據都保存
在服務器上面,
客戶端每次請求服務器的時候會發(fā)送 當前會話的session_id,服務器根據當前session_id判斷相應的用
戶數據標志,以確定用戶是否登錄,或具有某種權限。
由于數據是存儲在服務器 上面,所以你不能偽造,但是如果你能夠獲取某個登錄用戶的session_id,用
特殊的瀏覽器偽造該用戶的請求也是能夠成功的。
session_id是服務 器和客戶端鏈接時候隨機分配的,一般來說是不會有重復,但如果有大量的并發(fā)請
求,也不是沒有重復的可能性,我曾經就遇到過一次。
登錄某個網站,開始顯示的 是自己的信息,等一段時間超時了,一刷新,居然顯示了別人的信息。
Session是由應用服務器維持的一個服務器端的存儲空間,用戶在連接服務器時,會由服務器生成一個
唯一的SessionID,用該SessionID 為標識符來存取服務器端的Session存儲空間。而SessionID這一數據
則是保存到客戶端,用Cookie保存的,用戶提交頁面時,會將這一 SessionID提交到服務器端,來存取
Session數據。這一過程,是不用開發(fā)人員干預的。所以一旦客戶端禁用Cookie,那么Session也會失
效。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙考慮到安全應當使用
session。
3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能考慮到減輕服務
器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。(Session對
象沒有對存儲的數據量的限制,其中可以保存更為復雜的數據類型)
10、Web開發(fā)中有哪些技術手段防止SQL注入?
1.使用預編譯綁定變量的SQL語句
2.嚴格加密處理用戶的機密信息
3.不要隨意開啟生產環(huán)境中Webserver的錯誤顯示
4.使用正則表達式過濾傳入的參數
5.字符串過濾
6.檢查是否包函非法字符
11、如何查看占用8080端口的是什么進程?
windows查看端口占用
在windows命令行窗口下執(zhí)行:
netstat -aon|findstr "8080"
linux系統(tǒng)
先使用 netstat命令,再用 ps命令
執(zhí)行命令: netstat -anp|grep 8080
輸出結果: tcp 0 0 :::8080 :::* LISTEN 12006/java
執(zhí)行命令: ps -ef | grep 12006
12、談談Django中的中間件。
django.middleware.security.SecurityMiddleware’
一些安全設置,比如XSS腳本過濾。
django.contrib.sessions.middleware.SessionMiddleware
session支持中間件,加入這個中間件,會在數據庫中生成一個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
用戶授權中間件。他會在每個HttpRequest對象到達view之前添加當前登錄用戶的user屬性,也就是你可
以在view中通過request訪問user
django.contrib.messages.middleware.MessageMiddleware
消息中間件。展示一些后臺信息給前端頁面。如果需要用到消息,還需要在INSTALLED_APPS中添加
django.contrib.message才能有效。如果不需要,可以把這兩個都刪除
django.middleware.clickjacking.XFrameOptionsMiddleware
防止通過瀏覽器頁面跨Frame出現clickjacking(欺騙點擊)攻擊出現。
13、談談CSRF原理
CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/
sessionriding,縮寫為:CSRF/XSRF。
你這可以這么理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義發(fā)送惡意請求。CSRF能夠做的事情
包括:以你名義發(fā)送郵件,發(fā)消息,盜取你的賬號,甚至于購買商品,虛擬貨幣轉賬......造成的問題包
括:個人隱私泄露以及財產安全。
要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
1.登錄受信任網站A,并在本地生成Cookie。
2.在不登出A的情況下,訪問危險網站B。
14、談談RESTful規(guī)范
Representational State Transfer "表現層狀態(tài)轉化"
restful其實就是一套編寫接口的協(xié)議,協(xié)議規(guī)定如何編寫以及如何設置返回值、狀態(tài)碼等信息。
restful: 給用戶一個url,根據method不同在后端做不同的處理,比如:post 創(chuàng)建數據、get獲取數據、put
和patch修改數據、delete刪除數據。
(1)每一個URI代表一種資源;
(2)客戶端和服務器之間,傳遞這種資源的某種表現層;
(3)客戶端通過四個HTTP動詞,對服務器端資源進行操作,實現"表現層狀態(tài)轉化"。
我們常用的狀態(tài)碼:
200 請求成功
301 永久重定向
302 臨時重定向
403 權限問題
404 找不到頁面
500 服務器問題
15、Django中FBV與CBV
FBV(function base views) 就是在視圖里使用函數處理請求。
CBV(class base views) 就是在視圖里使用類處理請求。
如果我們要寫一個處理GET方法的view,用函數寫的話是下面這樣。
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是將一個請求分配給可調用的函數的,而不是一個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、談談Django REST freamwork
自動生成符合 RESTful 規(guī)范的 API
支持 OPTION、HEAD、POST、GET、PATCH、PUT、DELETE
根據 Content-Type 來動態(tài)的返回數據類型(如 text、json)
Django Rest framework 的流程大概是這樣的
1.建立 Models
2.依靠 Serialiers 將數據庫取出的數據 Parse 為 API 的數據(可用于返回給客戶端,也可用于瀏覽器
顯示)
3.ViewSet 是一個 views 的集合,根據客戶端的請求(GET、POST等),返回 Serialiers 處理的數據
權限 Premissions 也在這一步做處理
4.ViewSet 可在 Routers 進行注冊,注冊后會顯示在 Api Root 頁上
5.在 urls 里注冊 ViewSet 生成的 view,指定監(jiān)聽的 url
17、對Django的認識?
#1.Django是走大而全的方向,它最出名的是其全自動化的管理后臺:只需要使用起ORM,做簡單的對象
定義,它就能自動生成數據庫結構、以及全功能的管理后臺。
#2.Django內置的ORM跟框架內的其他模塊耦合程度高。
#應用程序必須使用Django內置的ORM,否則就不能享受到框架內提供的種種基于其ORM的便利;
#理論上可以切換掉其ORM模塊,但這就相當于要把裝修完畢的房子拆除重新裝修,倒不如一開始就去毛
胚房做全新的裝修。
#3.Django的賣點是超高的開發(fā)效率,其性能擴展有限;采用Django的項目,在流量達到一定規(guī)模后,都
需要對其進行重構,才能滿足性能的要求。
#4.Django適用的是中小型的網站,或者是作為大型網站快速實現產品雛形的工具。
#5.Django模板的設計哲學是徹底的將代碼、樣式分離; Django從根本上杜絕在模板中進行編碼、處理數
據的可能。
18、Django 、Flask、Tornado的對比
#1.Django走的是大而全的方向,開發(fā)效率高。它的MTV框架,自帶的ORM,admin后臺管理,自帶的sqlite數據
庫和開發(fā)測試用的服務器
#給開發(fā)者提高了超高的開發(fā)效率
#2.Flask是輕量級的框架,自由,靈活,可擴展性很強,核心基于Werkzeug WSGI工具和jinja2模板引擎
#3.Tornado走的是少而精的方向,性能優(yōu)越。它最出名的是異步非阻塞的設計方式
#Tornado的兩大核心模塊:
# 1.iostraem:對非阻塞式的socket進行簡單的封裝
# 2.ioloop:對I/O多路復用的封裝,它實現了一個單例
19、什么是wsgi,uwsgi,uWSGI?
#WSGI:
# web服務器網關接口,是一套協(xié)議。用于接收用戶請求并將請求進行初次封裝,然后將請求交給web框架
# 實現wsgi協(xié)議的模塊:
# 1.wsgiref,本質上就是編寫一個socket服務端,用于接收用戶請求(django)
# 2.werkzeug,本質上就是編寫一個socket服務端,用于接收用戶請求(flask)
#uwsgi:
# 與WSGI一樣是一種通信協(xié)議,它是uWSGI服務器的獨占協(xié)議,用于定義傳輸信息的類型
#uWSGI:
# 是一個web服務器,實現了WSGI協(xié)議,uWSGI協(xié)議,http協(xié)議,
20、django請求的生命周期?
#1.wsgi,請求封裝后交給web框架 (Flask、Django)
#2.中間件,對請求進行校驗或在請求對象中添加其他相關數據,例如:csrf、request.session -
#3.路由匹配 根據瀏覽器發(fā)送的不同url去匹配不同的視圖函數
#4.視圖函數,在視圖函數中進行業(yè)務邏輯的處理,可能涉及到:orm、templates => 渲染 -
#5.中間件,對響應的數據進行處理。
#6.wsgi,將響應的內容發(fā)送給瀏覽器。
21、簡述什么是FBV和CBV?
#FBV和CBV本質是一樣的
#基于函數的視圖叫做FBV,基于類的視圖叫做CBV
#在python中使用CBV的優(yōu)點:
#1.提高了代碼的復用性,可以使用面向對象的技術,比如Mixin(多繼承)
#2.可以用不同的函數針對不同的HTTP方法處理,而不是通過很多if判斷,提高代碼可讀性
22、如何給CBV的程序添加裝飾器?
#引入method_decorator模塊
#1.直接在類上加裝飾器
#@method_decorator(test,name='dispatch')
#class Loginview(View):
# pass
#2.直接在處理的函數前加裝飾器
#@method_decorator(test)
# def post(self,request,*args,**kwargs):pass
以上,就是python面試基礎知識,小編還會陸續(xù)更新哦!希望大家都能找到合適的工作!
————————————————
版權聲明:本文為CSDN博主「單車欲問邊」的原創(chuàng)文章