python面試題(知識點)整理

前言:? ?

? ? 積累知識沒有盡頭!

?


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 正文:

1.HTTP協(xié)議是什么?你的理解是?

? ? HTTP協(xié)議是建立在TCP協(xié)議之上的互聯(lián)網通信協(xié)議,他的本質是客戶端(瀏覽器)發(fā)送給服務器端一次請求后服務器返回一次響應后就會斷開連接,所以HTTP協(xié)議是無狀態(tài)的,是短鏈接。

? ? 客戶端發(fā)送給服務器端的數(shù)據(jù)叫做請求,請求由請求頭請求體組成,他們之間由\r\n\r\n分割,數(shù)據(jù)的分割使用\r\n

? ? 服務器端返回給客戶端的數(shù)據(jù)叫做響應,響應由響應頭響應體組成,分割同請求


2.Django的請求生命周期

????客戶端通過URL來訪問服務器,先經過wsgi模塊,wsgi模塊會對請求數(shù)據(jù)進行初次封裝。進入Django的中間件之前會進行二次封裝,再經過Django的中間件,執(zhí)行中間件的process_request函數(shù)。這個函數(shù)會返回None或HttpResponse 對象,None則繼續(xù)執(zhí)行下一個中間件,返回對象則直接跳過中間件。中間件之后是路由的分發(fā),分發(fā)給視圖(CBV或FBV)視圖部分負責業(yè)務邏輯,有可能會進行對數(shù)據(jù)庫的操作和模板的替換等并返回,然后再經過中間件的process_response函數(shù)再通過wsgi向網絡傳輸


3.你對wsgi有什么了解?

? ? wsgi實際上是一個遵循wsgi標準的一個Django組件。是一個socket服務端,它可以實現(xiàn)對請求的封裝等。


4.Django的中間件是什么?

? ? 中間件實際上就是一個類,他有5個方法。他在請求到來和結束后,django會根據(jù)自己的規(guī)則在合適的時機執(zhí)行中間件中相應的方法。當接收請求的時候會執(zhí)行類中的process_request函數(shù),在返回響應的時候經過中間件的process_response函數(shù)

·process_request(self,request): 請求到達之后之后先執(zhí)行這個中間件

·process_view(self, request, callback, callback_args, callback_kwargs):

·process_exception(self, request, exception) 這個方法只有在出現(xiàn)錯誤的時候才會觸發(fā)

·process_response(self, request, response):請求處理完成出去之后執(zhí)行這個自己解決

·process_template_response(self,request,response) 這個方法只有在返回對象中有render方法的時候才執(zhí)行,如render_to_response('/index/')


5.你使用中間件做過什么?

? ? 我利用過中間件的csrftoken模塊做過請求的校驗,也使用過session模塊做過用戶的認證

? ? 此外,我自己寫過權限認證,登陸認證等中間件


6.FBV和CBV是什么?兩者有什么區(qū)別?你認為哪種好?

? ? 我認為FBV和CBV沒有太大的差別。FBV和CBV的的本質是一樣的,都是執(zhí)行調用內部的View函數(shù)。不過CBV可以通過繼承類的方式來便捷的添加組件,F(xiàn)BV可能更好理解。兩者都有擅長的情況


7.你對restful規(guī)范了解多少?

? ? restful是一種設計原則,一種建議。

? ? restful建議使用HTTPS協(xié)議來保證傳輸?shù)陌踩?/p>

? ? 如果URL是接口就要在URL上體現(xiàn)該URL是一個API接口

? ? URL要體現(xiàn)出版本號方便識別和管理

? ? restful認為網絡一切皆資源所以URL的HTTP為名詞而非動詞

? ? URL上要加條件(參數(shù))來過濾結果

????同一個URL的method不同要進行不同的操作

? ? 在請求數(shù)據(jù)發(fā)送后,后端要響應數(shù)據(jù)給前端

? ? 后端在返回數(shù)據(jù)時要帶上狀態(tài)碼提高辨識度

? ? 如果前端的請求有錯誤要返回錯誤信息

? ??Hypermedia,即返回結果中提供鏈接,連向其他API方法,使得用戶不查文檔,也知道下一步應該做什么。


8.django rest framework框架有什么作用?有幾個插件?

????django的rest framework框架是一個快速搭建基于restful規(guī)范的接口的類

? ? 路由,視圖,版本,認證,權限,訪問頻率,解析器,序列化,分頁,渲染

? ??-路由,

????? -可以通過as_view傳參數(shù),根據(jù)請求方式不同執(zhí)行相應的方法

????? -可以在url中設置一個結尾,類似于: .json

????-視圖,

????????? -幫助開發(fā)者提供了一些類,并在類中提供了多個方法以供我們使用。

????-版本,

????????? -在url中設置version參數(shù),用戶請求時候傳入參數(shù)。在request.version中獲取版本,根據(jù)版本不同做不同處理

????-認證,

????????? -寫一個類并注冊到認證類,在類的的authticate方法中編寫認證邏輯。

? ? ????? ? -認證成功(user,auth)

? ? ????? ? -認證失敗raise AuthticateFaild(....)

? ? ????? ? -匿名用戶None

????-權限

????????? -寫一個類并注冊到權限類,在類的的has_permission方法中編寫認證邏輯。

? ????? ????? -True

? ????????? ? -False

????-頻率限制

????????? -寫一個類并注冊到頻率類,在類的的 allow_request/wait方法中編寫認證邏輯。

? ????????? ? allow_request

????????-True

? ? ? ? ? ? ? -False? 如果返回False,那么就要執(zhí)行wait

????-解析器,

????????? -根據(jù)ContentType請求頭,選擇不同解析器對 請求體中的數(shù)據(jù)進行解析。

?????? ????? POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:url-formendo.... \r\n\r\nuser=alex&age=123

? ? ? ? ? ? ?POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:application/json\r\n\r\n{....}

????-分頁

????? -對從數(shù)據(jù)庫中獲取到的數(shù)據(jù)進行分頁處理: SQL -> limit offset

????????????-根據(jù)頁碼:http://www.luffycity.com/api/v1/student/?page=1&size=10

? ? ? ? ? ?-根據(jù)索引:http://www.luffycity.com/api/v1/student/?offset=60&limit=10

? ????? ? -根據(jù)加密:http://www.luffycity.com/api/v1/student/?page=erd8

????贈送:頁碼越大速度越慢,為什么以及如何解決?

? ? ? ? ????原因:頁碼越大向后需要掃描的行數(shù)越多,因為每次都是從0開始掃描。

????解決:

? ? ? ? ? ? -限制顯示的頁數(shù)

? ? ? ? ? ? -記錄當前頁數(shù)據(jù)ID最大值和最小值,再次分頁時,根據(jù)ID現(xiàn)行篩選,然后再分頁。

????-序列化

????????? -對queryset序列化以及對請求數(shù)據(jù)格式校驗。

????-渲染器

????????? -根據(jù)URL中傳入的后綴,決定在數(shù)據(jù)如何渲染到到頁面上。


9.django rest framework繼承了哪幾個類?

? ??APIView,ViewSetMinxin(可以在URL中加字典)

? ??GenericAPIView

? ??GenericViewSet

? ??ModelViewSet


10.django rest framework的訪問頻率組件原理是什么?

? ? 在用戶訪問的時候在內部的一個字典里記錄下該ip和訪問時間。ip為鍵,值為列表,列表內部是訪問時間,當該ip第二次訪問的時候會在列表第一位添加新的時間,再添加之前會先拿到定義的規(guī)定時間,用最新訪問的時間減去規(guī)定時間并遍歷這個列表將規(guī)定時間之前的記錄刪除,留下的就是規(guī)定時間內該ip訪問的記錄,然后就可以判斷是否超過規(guī)定次數(shù)來決定是否禁止訪問。但是這種方法不能完全的起到效果因為ip是可以更換的,使用token的方法來確認是否是同一用戶好一點但是也不是完美的。我覺得可以對資源進行權限限制比如必須要登陸,然后對賬號做限制比如將賬號綁定手機號這種,還可以對賬號的登陸地點,登陸頻率進行監(jiān)測。


11.跨域是什么?怎么解決?

? ? 跨域是瀏覽器的同源策略導致默認情況下不允許瀏覽器當前頁面請求外域的數(shù)據(jù),解決方法有:

? ? jsonP? ? 利用瀏覽器不攔截有src的標簽例如img標簽等的跨域請求來動態(tài)創(chuàng)建一個script標簽

? ? ? ? 同時在客戶端設置一個回調函數(shù),服務器接收到后該函數(shù),客戶端接收執(zhí)行

????????因為是用script標簽所以只能發(fā)送GET請求且雙方必須約定好函數(shù)的名字

? ? cors? ? 設置響應頭來告訴瀏覽器可以跨域

? ? 復雜請求的話先發(fā)送一個預檢,請求是OPTIONS請求,服務器返回瀏覽器同意發(fā)送后才發(fā)送正常的請求

? ? 在Django中可以寫一個中間件來寫入請求頭達到支持跨域的目的


12. 常見請求頭

? ? ? ? ? - Content-Type

????????- User-Agent

????????- referer,可以做圖片防盜鏈。

? ? ? ? ?- Host

????????- cookies


13.?常見的請求方法:

? ???? - GET/POST/DELETE/PUT/PATCH/OPTIONS


14. 常見的狀態(tài)碼:

? ???? -200

????? -301/302

????? -403/404

????? -500


15.狀態(tài)碼的代表的現(xiàn)象是什么?

????返回的狀態(tài)碼和狀態(tài)不一致的情況是有可能發(fā)生得?

????比如Web應用程序內部錯誤,但仍然返回 200 OK

????200 OK?

????????請求正常處理完畢

????204 No Content?

????????請求成功處理,沒有實體的主體返回

????206 Partial Content?

????????GET范圍請求已成功處理

????301 Moved Permanently?

????????永久重定向,資源已永久分配新URI

????302 Found?

????????臨時重定向,資源已臨時分配新URI

????303 See Other?

????????臨時重定向,期望使用GET定向獲取

????304 Not Modified?

????????發(fā)送的附帶條件請求未滿足

????307 Temporary Redirect?

????????臨時重定向,POST不會變成GET

????400 Bad Request?

????????請求報文語法錯誤或參數(shù)錯誤

????401 Unauthorized?

????????需要通過HTTP認證,或認證失敗

????403 Forbidden?

????????請求資源被拒絕

????404 Not Found?

????????無法找到請求資源(服務器無理由拒絕)

????500 Internal Server Error?

????????服務器故障或Web應用故障

????503 Service Unavailable?

????????服務器超負載或停機維護


16.類的構造函數(shù)是什么?:

? ? 類的構造函數(shù)是 __init__

? ? 但是在實例化的時候在執(zhí)行 __init__ 之前會先執(zhí)行? __new__ 函數(shù)


17.字符串的類是怎么導入的?

? ? 先用????rsplit()? ? 將最后要導入的組件拿出來,然后將前面的導入路徑使用getattr()? ? 使用反射導入


18.常見的請求頭有哪些?

? ??Accept:告訴服務器,客戶端支持的數(shù)據(jù)類型。

????Accept-Charset:告訴服務器,客戶端采用的編碼。

????Accept-Encoding:告訴服務器,客戶機支持的數(shù)據(jù)壓縮格式。

????Accept-Language:告訴服務器,客戶機的語言環(huán)境。

????Host:客戶機通過這個頭告訴服務器,想訪問的主機名。

????If-Modified-Since:客戶機通過這個頭告訴服務器,資源的緩存時間。

????Referer:客戶機通過這個頭告訴服務器,它是從哪個資源來訪問服務器的。(一般用于防盜鏈)

????User-Agent:客戶機通過這個頭告訴服務器,客戶機的軟件環(huán)境。

????Cookie:客戶機通過這個頭告訴服務器,可以向服務器帶數(shù)據(jù)。

? ??Content-Language:服務器通過這個頭,告訴服務器的語言環(huán)境。

????Content-Type:服務器通過這個頭,回送數(shù)據(jù)的類型


19.請求體是什么格式?

? ??Form表單提交:

????? POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=alex&password=123&...

????Ajax請求:

????? POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=alex&password=123&...

? ? ? POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\n{“username”:"alex","password":123}

????補充:django中獲取請求體(未解析過的)

????? - request.POST

? ? ?- request.body


20.如果代碼出現(xiàn)bug,你們是如何解決?

????創(chuàng)建一個bug分支,然后進行bug處理,處理完畢后,合并到master分支。

????刪除bug分支

????回到dev分支繼續(xù)開發(fā)。


21.git rebase的作用?

? ? ? ? 保持提交記錄的整潔。


22.做代碼review

????? 如何做代碼review?

? ? ? - 創(chuàng)建review分支:

????????誰來鎖代碼review?

????????- 組長


23.原生Ajax

????? - XMLHttpRequest



? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 待補充

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容