您好,登錄后才能下訂單哦!
小編給大家分享一下django項目面試可能會問什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一.說說對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ù)的可能。
二.WSGI 和 uWSGI在django中的作用
WSGI
WSGI是一種WEB服務(wù)器 ==網(wǎng)關(guān)接口==。 是一個Web服務(wù)器(如nginx)與應(yīng)用服務(wù)器(如uWSGI)通信的一種規(guī)范(協(xié)議)。
在生產(chǎn)環(huán)境中使用WSGI作為python web的服務(wù)器。Python Web服務(wù)器網(wǎng)關(guān)接口,是Python應(yīng)用程序或框架和Web服務(wù)器之間的一種接口,被廣泛接受。WSGI沒有官方的實現(xiàn), 因為WSGI更像一個協(xié)議,只要遵照這些協(xié)議,WSGI應(yīng)用(Application)都可以在任何服務(wù)器(Server)上運行。
uWSGI
uWSGI實現(xiàn)了WSGI的所有接口,是一個快速、自我修復(fù)、開發(fā)人員和系統(tǒng)管理員友好的服務(wù)器。uWSGI代碼完全用C編寫,效率高、性能穩(wěn)定。
uwsgi是一種線路協(xié)議而不是通信協(xié)議,在此常用于在uWSGI服務(wù)器與其他網(wǎng)絡(luò)服務(wù)器的數(shù)據(jù)通信。uwsgi協(xié)議是一個uWSGI服務(wù)器自有的協(xié)議,它用于定義傳輸信息的類型。
作用
Django 是一個 Web 框架,框架的作用在于處理 request 和 reponse,其他的不是框架所關(guān)心的內(nèi)容。所以怎么部署 Django 不是 Django 所需要關(guān)心的。
Django 所提供的是一個開發(fā)服務(wù)器,這個開發(fā)服務(wù)器,沒有經(jīng)過安全測試,而且使用的是 Python 自帶的 simple HTTPServer 創(chuàng)建的,在安全性和效率上都是不行的
而uWSGI 是一個全功能的 HTTP 服務(wù)器,他要做的就是把 HTTP 協(xié)議轉(zhuǎn)化成語言支持的網(wǎng)絡(luò)協(xié)議。比如把 HTTP 協(xié)議轉(zhuǎn)化成 WSGI 協(xié)議,讓 Python 可以直接使用。
uwsgi 是一種 uWSGI 的內(nèi)部協(xié)議,使用二進制方式和其他應(yīng)用程序進行通信。
三.什么是wsgi?
WSGI是Python在處理HTTP請求時,規(guī)定的一種處理方式。如一個HTTP Request過來了,那么就有一個相應(yīng)的處理函數(shù)來進行處理和返回結(jié)果。WSGI就是規(guī)定這個處理函數(shù)的參數(shù)長啥樣的,它的返回結(jié)果是長啥樣的?至于該處理函數(shù)的名子和處理邏輯是啥樣的,那無所謂。簡單而言,WSGI就是規(guī)定了處理函數(shù)的輸入和輸出格式。
四.django請求的生命周期?
當(dāng)用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發(fā)給服務(wù)端
請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現(xiàn)在url之中.
url經(jīng)過Django中的wsgi,再經(jīng)過Django的中間件,最后url到過路由映射表,在路由中一條一條進行匹配,
一旦其中一條匹配成功就執(zhí)行對應(yīng)的視圖函數(shù),后面的路由就不再繼續(xù)匹配了.
視圖函數(shù)根據(jù)客戶端的請求查詢相應(yīng)的數(shù)據(jù).返回給Django,然后Django把客戶端想要的數(shù)據(jù)做為一個字符串返回給客戶端.
客戶端瀏覽器接收到返回的數(shù)據(jù),經(jīng)過渲染后顯示給用戶.
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ā)送給瀏覽器。
五.列舉django的內(nèi)置組件?
Admin是對model中對應(yīng)的數(shù)據(jù)表進行增刪改查提供的組件
model組件:負(fù)責(zé)操作數(shù)據(jù)庫
form組件:1.生成HTML代碼2.數(shù)據(jù)有效性校驗3校驗信息返回并展示
ModelForm組件即用于數(shù)據(jù)庫操作,也可用于用戶請求的驗證
六.列舉django中間件的5個方法?以及django中間件的應(yīng)用場景?
process_request : 請求進來時,權(quán)限認(rèn)證
process_view : 路由匹配之后,能夠得到視圖函數(shù)
process_exception : 異常時執(zhí)行
process_template_responseprocess : 模板渲染時執(zhí)行
process_response : 請求有響應(yīng)時執(zhí)行
七.簡述什么是FBV和CBV?
FBV和CBV本質(zhì)是一樣的,基于函數(shù)的視圖叫做FBV,基于類的視圖叫做CBV
在python中使用CBV的優(yōu)點:
提高了代碼的復(fù)用性,可以使用面向?qū)ο蟮募夹g(shù),比如Mixin(多繼承)
可以用不同的函數(shù)針對不同的HTTP方法處理,而不是通過很多if判斷,提高代碼可讀性
八.django的request對象是在什么時候創(chuàng)建的?
class WSGIHandler(base.BaseHandler):
-------request = self.request_class(environ)
請求走到WSGIHandler類的時候,執(zhí)行cell方法,將environ封裝成了request
九.如何給CBV的程序添加裝飾器?
from django.utils.decorators import method_decorator 1、給方法加: @method_decorator(check_login) def post(self, request): ... 2、給dispatch加: @method_decorator(check_login) def dispatch(self, request, *args, **kwargs): ...
給類加:
@method_decorator(check_login, name="get") @method_decorator(check_login, name="post") class HomeView(View): ...
十.列舉django orm 中所有的方法(QuerySet對象的所有方法)
<1> all(): 查詢所有結(jié)果 <2> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象。獲取不到返回None <3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結(jié)果有且只有一個。 如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。 <4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象 <5> order_by(*field): 對查詢結(jié)果排序 <6> reverse(): 對查詢結(jié)果反向排序 <8> count(): 返回數(shù)據(jù)庫中匹配查詢(QuerySet)的對象數(shù)量。 <9> first(): 返回第一條記錄 <10> last(): 返回最后一條記錄 <11> exists(): 如果QuerySet包含數(shù)據(jù),就返回True,否則返回False <12> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,運行后得到的 并不是一系 model的實例化對象,而是一個可迭代的字典序列 <13> values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列 <14> distinct(): 從返回結(jié)果中剔除重復(fù)紀(jì)錄
.select_related和prefetch_related的區(qū)別?
前提:有外鍵存在時,可以很好的減少數(shù)據(jù)庫請求的次數(shù),提高性能
select_related通過多表join關(guān)聯(lián)查詢,一次性獲得所有數(shù)據(jù),只執(zhí)行一次SQL查詢
prefetch_related分別查詢每個表,然后根據(jù)它們之間的關(guān)系進行處理,執(zhí)行兩次查詢
十一.filter和exclude的區(qū)別?
兩者取到的值都是QuerySet對象,filter選擇滿足條件的,exclude:排除滿足條件的.
十二.列舉django orm中三種能寫sql語句的方法
1.使用execute執(zhí)行自定義的SQL
直接執(zhí)行SQL語句(類似于pymysql的用法) # 更高靈活度的方式執(zhí)行原生SQL語句 from django.db import connection cursor = connection.cursor() cursor.execute("SELECT DATE_FORMAT(create_time, '%Y-%m') FROM blog_article;") ret = cursor.fetchall() print(ret)
2.使用extra方法 :queryset.extra(select={"key": "原生的SQL語句"})
3.使用raw方法
執(zhí)行原始sql并返回模型
依賴model多用于查詢
十三.values和values_list的區(qū)別?
values : queryset類型的列表中是字典 values_list : queryset類型的列表中是元組
十四.cookie和session的區(qū)別:
cookie:
cookie是保存在瀏覽器端的鍵值對,可以用來做用戶認(rèn)證
session:
將用戶的會話信息保存在服務(wù)端,key值是隨機產(chǎn)生的字符串,value值是session的內(nèi)容
依賴于cookie將每個用戶的隨機字符串保存到用戶瀏覽器上
Django中session默認(rèn)保存在數(shù)據(jù)庫中:django_session表
flask,session默認(rèn)將加密的數(shù)據(jù)寫在用戶的cookie中
十五.如何使用django orm批量創(chuàng)建數(shù)據(jù)?
objs=[models.Book(title="圖書{}".format(i+15)) for i in range(100)] models.Book.objects.bulk_create(objs)
十六.django的Form組件中,如果字段中包含choices參數(shù),請使用兩種方式實現(xiàn)數(shù)據(jù)源實時更新
1.重寫構(gòu)造函數(shù)
def__init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name")
2.利用ModelChoiceField字段,參數(shù)為queryset對象
authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())//多選
十七.django的Model中的ForeignKey字段中的on_delete參數(shù)有什么作用?
刪除關(guān)聯(lián)表中的數(shù)據(jù)時,當(dāng)前表與其關(guān)聯(lián)的field的操作
django2.0之后,表與表之間關(guān)聯(lián)的時候,必須要寫on_delete參數(shù),否則會報異常
十八.django的模板中自定義filter和simple_tag的區(qū)別?
自定義filter:{{ 參數(shù)1|filter函數(shù)名:參數(shù)2 }}
1.可以與if標(biāo)簽來連用
2.自定義時需要寫兩個形參
例子:自定義filter 1. 在app01下創(chuàng)建一個叫templatetags的Python包 2. 在templatetags的文件夾下創(chuàng)建py文件 myfilters 3. 在py文件中寫代碼 from django import template register = template.Library() @register.filter def add_sb(value,arg='aaa'): return "{}_sb_{}".formart(value,arg) @register.filter(name='sb') def add_sb(value,arg='aaa'): return "{}_sb_{}".formart(value,arg) 4. 使用自定義filter {% load myfilters %} {{ name|add_sb:'xxx'}} {{ name|sb:'xxx'}} simple_tag:{% simple_tag函數(shù)名 參數(shù)1 參數(shù)2 %}
1.可以傳多個參數(shù),沒有限制
2.不能與if標(biāo)簽來連用
例子:自定義simpletag
創(chuàng)建
1 、在app01中創(chuàng)建一個名字是templatetags的包, 2、在包中創(chuàng)建一個py文件 3、在py文件中導(dǎo)入 from django import template register = template.Library() 4、寫函數(shù) @register.simple_tag(name="plus") def plus(a,b,c): return '{}+{}+{}'.format(a,b,c) 5、加裝飾器@register.simple_tag(name="plus")
使用
1、導(dǎo)入
{% load mytag %}
2、使用
{% plus 1 2 3 %}
十九.django中csrf的實現(xiàn)機制
第一步:django第一次響應(yīng)來自某個客戶端的請求時,后端隨機產(chǎn)生一個token值,把這個token保存在SESSION狀態(tài)中;同時,后端把這個token放到cookie中交給前端頁面;
第二步:下次前端需要發(fā)起請求(比如發(fā)帖)的時候把這個token值加入到請求數(shù)據(jù)或者頭信息中,一起傳給后端;Cookies:{csrftoken:xxxxx}
第三步:后端校驗前端請求帶過來的token和SESSION里的token是否一致。
二十.基于django使用ajax發(fā)送post請求時,都可以使用哪種方法攜帶csrf token?
1.后端將csrftoken傳到前端,發(fā)送post請求時攜帶這個值發(fā)送
data: { csrfmiddlewaretoken: '{{ csrf_token }}' },
2.獲取form中隱藏標(biāo)簽的csrftoken值,加入到請求數(shù)據(jù)中傳給后端
data: { csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() },
3.cookie中存在csrftoken,將csrftoken值放到請求頭中
headers:{ "X-CSRFtoken":$.cookie("csrftoken")}
二十一.Django本身提供了runserver,為什么不能用來部署?(runserver與uWSGI的區(qū)別)
1.runserver方法是調(diào)試 Django 時經(jīng)常用到的運行方式,它使用Django自帶的
WSGI Server 運行,主要在測試和開發(fā)中使用,并且 runserver 開啟的方式也是單進程 。
2.uWSGI是一個Web服務(wù)器,它實現(xiàn)了WSGI協(xié)議、uwsgi、http 等協(xié)議。注意uwsgi是一種通信協(xié)議,而uWSGI是實現(xiàn)uwsgi協(xié)議和WSGI協(xié)議的 Web 服務(wù)器。uWSGI具有超快的性能、低內(nèi)存占用和多app管理等優(yōu)點,并且搭配著Nginx就是一個生產(chǎn)環(huán)境了,能夠?qū)⒂脩粼L問請求與應(yīng)用 app 隔離開,實現(xiàn)真正的部署 。相比來講,支持的并發(fā)量更高,方便管理多進程,發(fā)揮多核的優(yōu)勢,提升性能。
二十二.Django如何實現(xiàn)websocket?
django實現(xiàn)websocket官方推薦大家使用channels。channels通過升級http協(xié)議 升級到websocket協(xié)議。
以上是“django項目面試可能會問什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。