Django面試問題

1. 對Django的認識塘辅?

#1.Django是走大而全的方向,它最出名的是其全自動化的管理后臺:只需要使用起ORM皆撩,做簡單的對象定義扣墩,它就能自動生成數(shù)據(jù)庫結(jié)構(gòu)、以及全功能的管理后臺扛吞。
#2.Django內(nèi)置的ORM跟框架內(nèi)的其他模塊耦合程度高呻惕。
# 應用程序必須使用Django內(nèi)置的ORM,否則就不能享受到框架內(nèi)提供的種種基于其ORM的便利滥比;
# 理論上可以切換掉其ORM模塊亚脆,但這就相當于要把裝修完畢的房子拆除重新裝修,倒不如一開始就去毛胚房做全新的裝修盲泛。
#3.Django的賣點是超高的開發(fā)效率濒持,其性能擴展有限;采用Django的項目寺滚,在流量達到一定規(guī)模后柑营,都需要對其進行重構(gòu),才能滿足性能的要求村视。
#4.Django適用的是中小型的網(wǎng)站官套,或者是作為大型網(wǎng)站快速實現(xiàn)產(chǎn)品雛形的工具。
#5.Django模板的設計哲學是徹底的將代碼蚁孔、樣式分離奶赔; Django從根本上杜絕在模板中進行編碼、處理數(shù)據(jù)的可能杠氢。

2.WSGI 和 uWSGI在django中的作用

WSGI

WSGI是一種WEB服務器  ==網(wǎng)關接口==站刑。 是一個Web服務器(如nginx)與應用服務器(如uWSGI)通信的一種規(guī)范(協(xié)議)。

在生產(chǎn)環(huán)境中使用WSGI作為python web的服務器鼻百。Python Web服務器網(wǎng)關接口笛钝,是Python應用程序或框架和Web服務器之間的一種接口质况,被廣泛接受。WSGI沒有官方的實現(xiàn), 因為WSGI更像一個協(xié)議玻靡,只要遵照這些協(xié)議,WSGI應用(Application)都可以在任何服務器(Server)上運行中贝。

uWSGI

uWSGI實現(xiàn)了WSGI的所有接口囤捻,是一個快速、自我修復邻寿、開發(fā)人員和系統(tǒng)管理員友好的服務器蝎土。uWSGI代碼完全用C編寫,效率高绣否、性能穩(wěn)定誊涯。
 
uwsgi是一種線路協(xié)議而不是通信協(xié)議,在此常用于在uWSGI服務器與其他網(wǎng)絡服務器的數(shù)據(jù)通信蒜撮。uwsgi協(xié)議是一個uWSGI服務器自有的協(xié)議暴构,它用于定義傳輸信息的類型。

作用

Django 是一個 Web 框架段磨,框架的作用在于處理 request 和 reponse取逾,其他的不是框架所關心的內(nèi)容。所以怎么部署 Django 不是 Django 所需要關心的苹支。
 
Django 所提供的是一個開發(fā)服務器砾隅,這個開發(fā)服務器,沒有經(jīng)過安全測試债蜜,而且使用的是 Python 自帶的 simple HTTPServer 創(chuàng)建的晴埂,在安全性和效率上都是不行的
 
而uWSGI 是一個全功能的 HTTP 服務器,他要做的就是把 HTTP 協(xié)議轉(zhuǎn)化成語言支持的網(wǎng)絡協(xié)議寻定。比如把 HTTP 協(xié)議轉(zhuǎn)化成 WSGI 協(xié)議儒洛,讓 Python 可以直接使用。
uwsgi 是一種 uWSGI 的內(nèi)部協(xié)議特姐,使用二進制方式和其他應用程序進行通信晶丘。

3.什么是wsgi?

WSGI是Python在處理HTTP請求時唐含,規(guī)定的一種處理方式浅浮。如一個HTTP Request過來了,那么就有一個相應的處理函數(shù)來進行處理和返回結(jié)果捷枯。WSGI就是規(guī)定這個處理函數(shù)的參數(shù)長啥樣的滚秩,它的返回結(jié)果是長啥樣的?至于該處理函數(shù)的名子和處理邏輯是啥樣的淮捆,那無所謂郁油。簡單而言本股,WSGI就是規(guī)定了處理函數(shù)的輸入和輸出格式。

4.django請求的生命周期桐腌?

. 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發(fā)給服務端
請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現(xiàn)在url之中.
. url經(jīng)過Django中的wsgi,再經(jīng)過Django的中間件,最后url到過路由映射表,在路由中一條一條進行匹配,
一旦其中一條匹配成功就執(zhí)行對應的視圖函數(shù),后面的路由就不再繼續(xù)匹配了.
. 視圖函數(shù)根據(jù)客戶端的請求查詢相應的數(shù)據(jù).返回給Django,然后Django把客戶端想要的數(shù)據(jù)做為一個字符串返回給客戶端.
. 客戶端瀏覽器接收到返回的數(shù)據(jù),經(jīng)過渲染后顯示給用戶.
#1.wsgi,請求封裝后交給web框架 (Flask拄显、Django)    
#2.中間件,對請求進行校驗或在請求對象中添加其他相關數(shù)據(jù)案站,例如:csrf躬审、request.session     -
#3.路由匹配 根據(jù)瀏覽器發(fā)送的不同url去匹配不同的視圖函數(shù)   
#4.視圖函數(shù),在視圖函數(shù)中進行業(yè)務邏輯的處理蟆盐,可能涉及到:orm承边、templates => 渲染     -
#5.中間件,對響應的數(shù)據(jù)進行處理石挂。
#6.wsgi,將響應的內(nèi)容發(fā)送給瀏覽器博助。

5.列舉django的內(nèi)置組件?

.Admin是對model中對應的數(shù)據(jù)表進行增刪改查提供的組件
.model組件:負責操作數(shù)據(jù)庫
.form組件:1.生成HTML代碼2.數(shù)據(jù)有效性校驗3校驗信息返回并展示
.ModelForm組件即用于數(shù)據(jù)庫操作,也可用于用戶請求的驗證

6.列舉django中間件的5個方法痹愚?以及django中間件的應用場景富岳?

.process_request : 請求進來時,權(quán)限認證
.process_view : 路由匹配之后,能夠得到視圖函數(shù)
.process_exception : 異常時執(zhí)行
.process_template_responseprocess : 模板渲染時執(zhí)行
.process_response : 請求有響應時執(zhí)行

7.簡述什么是FBV和CBV?

FBV和CBV本質(zhì)是一樣的里伯,基于函數(shù)的視圖叫做FBV城瞎,基于類的視圖叫做CBV
在python中使用CBV的優(yōu)點:
- .提高了代碼的復用性,可以使用面向?qū)ο蟮募夹g(shù)疾瓮,比如Mixin(多繼承)
- .可以用不同的函數(shù)針對不同的HTTP方法處理脖镀,而不是通過很多if判斷,提高代碼可讀性

8.django的request對象是在什么時候創(chuàng)建的狼电?

class WSGIHandler(base.BaseHandler):
-------request = self.request_class(environ)
請求走到WSGIHandler類的時候蜒灰,執(zhí)行cell方法,將environ封裝成了request

9.如何給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):
                ...
        3削祈、給類加:
            @method_decorator(check_login, name="get")
            @method_decorator(check_login, name="post")
            class HomeView(View):
                ...

10.列舉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é)果中剔除重復紀錄

11.select_related和prefetch_related的區(qū)別?

前提:有外鍵存在時笑旺,可以很好的減少數(shù)據(jù)庫請求的次數(shù),提高性能
select_related通過多表join關聯(lián)查詢,一次性獲得所有數(shù)據(jù),只執(zhí)行一次SQL查詢
prefetch_related分別查詢每個表,然后根據(jù)它們之間的關系進行處理,執(zhí)行兩次查詢

12.filter和exclude的區(qū)別昼浦?

兩者取到的值都是QuerySet對象,filter選擇滿足條件的,exclude:排除滿足條件的.

13.列舉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方法
    1.執(zhí)行原始sql并返回模型
    2.依賴model多用于查詢

14.values和values_list的區(qū)別?

values : queryset類型的列表中是字典
values_list : queryset類型的列表中是元組

15.cookie和session的區(qū)別:

.cookie:
cookie是保存在瀏覽器端的鍵值對,可以用來做用戶認證
.session:
將用戶的會話信息保存在服務端,key值是隨機產(chǎn)生的字符串,value值是session的內(nèi)容
依賴于cookie將每個用戶的隨機字符串保存到用戶瀏覽器上
Django中session默認保存在數(shù)據(jù)庫中:django_session表
flask,session默認將加密的數(shù)據(jù)寫在用戶的cookie中

16.如何使用django orm批量創(chuàng)建數(shù)據(jù)筒主?

objs=[models.Book(title="圖書{}".format(i+15)) for i in range(100)]
models.Book.objects.bulk_create(objs)

17.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())//多選

18.django的Model中的ForeignKey字段中的on_delete參數(shù)有什么作用?

刪除關聯(lián)表中的數(shù)據(jù)時,當前表與其關聯(lián)的field的操作
django2.0之后物舒,表與表之間關聯(lián)的時候,必須要寫on_delete參數(shù),否則會報異常

19.django的模板中自定義filter和simple_tag的區(qū)別?

自定義filter:{{ 參數(shù)1|filter函數(shù)名:參數(shù)2 }}
1.可以與if標簽來連用
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標簽來連用

例子:自定義simpletag
    創(chuàng)建
        1 戏锹、在app01中創(chuàng)建一個名字是templatetags的包冠胯,
        2、在包中創(chuàng)建一個py文件
        3锦针、在py文件中導入
              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奈搜、導入
            {% load mytag %}
      2悉盆、使用
           {% plus 1 2 3 %}

20.django中csrf的實現(xiàn)機制

第一步:django第一次響應來自某個客戶端的請求時,后端隨機產(chǎn)生一個token值,把這個token保存在SESSION狀態(tài)中;同時,后端把這個token放到cookie中交給前端頁面馋吗;
第二步:下次前端需要發(fā)起請求(比如發(fā)帖)的時候把這個token值加入到請求數(shù)據(jù)或者頭信息中,一起傳給后端焕盟;Cookies:{csrftoken:xxxxx}
第三步:后端校驗前端請求帶過來的token和SESSION里的token是否一致。

21.基于django使用ajax發(fā)送post請求時宏粤,都可以使用哪種方法攜帶csrf token脚翘?

1.后端將csrftoken傳到前端,發(fā)送post請求時攜帶這個值發(fā)送

data: {
        csrfmiddlewaretoken: '{{ csrf_token }}'
  },


2.獲取form中隱藏標簽的csrftoken值绍哎,加入到請求數(shù)據(jù)中傳給后端

data: {
          csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()
     },


3.cookie中存在csrftoken,將csrftoken值放到請求頭中

headers:{ "X-CSRFtoken":$.cookie("csrftoken")}

22.Django本身提供了runserver来农,為什么不能用來部署?(runserver與uWSGI的區(qū)別)

1.runserver方法是調(diào)試 Django 時經(jīng)常用到的運行方式崇堰,它使用Django自帶的
WSGI Server 運行沃于,主要在測試和開發(fā)中使用,并且 runserver 開啟的方式也是單進程 海诲。
2.uWSGI是一個Web服務器繁莹,它實現(xiàn)了WSGI協(xié)議、uwsgi饿肺、http 等協(xié)議蒋困。注意uwsgi是一種通信協(xié)議,而uWSGI是實現(xiàn)uwsgi協(xié)議和WSGI協(xié)議的 Web 服務器敬辣。uWSGI具有超快的性能雪标、低內(nèi)存占用和多app管理等優(yōu)點零院,并且搭配著Nginx就是一個生產(chǎn)環(huán)境了,能夠?qū)⒂脩粼L問請求與應用 app 隔離開村刨,實現(xiàn)真正的部署 告抄。相比來講,支持的并發(fā)量更高嵌牺,方便管理多進程打洼,發(fā)揮多核的優(yōu)勢,提升性能逆粹。

23.Django如何實現(xiàn)websocket募疮?

django實現(xiàn)websocket官方推薦大家使用channels。channels通過升級http協(xié)議 升級到websocket協(xié)議僻弹。保證實時通訊阿浓。也就是說,我們完全可以用channels實現(xiàn)我們的即時通訊蹋绽。而不是使用長輪詢和計時器方式來保證偽實時通訊芭毙。他通過改造django框架,使django既支持http協(xié)議又支持websocket協(xié)議卸耘。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末退敦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚣抗,更是在濱河造成了極大的恐慌侈百,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忠聚,死亡現(xiàn)場離奇詭異设哗,居然都是意外死亡,警方通過查閱死者的電腦和手機两蟀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門网梢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赂毯,你說我怎么就攤上這事战虏。” “怎么了党涕?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵烦感,是天一觀的道長。 經(jīng)常有香客問我膛堤,道長手趣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮绿渣,結(jié)果婚禮上朝群,老公的妹妹穿的比我還像新娘。我一直安慰自己中符,他們只是感情好姜胖,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淀散,像睡著了一般右莱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上档插,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天慢蜓,我揣著相機與錄音,去河邊找鬼郭膛。 笑死胀瞪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的饲鄙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼圆雁,長吁一口氣:“原來是場噩夢啊……” “哼忍级!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伪朽,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤轴咱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后烈涮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朴肺,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年坚洽,在試婚紗的時候發(fā)現(xiàn)自己被綠了戈稿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡讶舰,死狀恐怖鞍盗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跳昼,我是刑警寧澤般甲,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站鹅颊,受9級特大地震影響敷存,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堪伍,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一锚烦、第九天 我趴在偏房一處隱蔽的房頂上張望觅闽。 院中可真熱鬧,春花似錦挽牢、人聲如沸谱煤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刘离。三九已至,卻和暖如春睹栖,著一層夾襖步出監(jiān)牢的瞬間硫惕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工野来, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恼除,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓曼氛,卻偏偏與公主長得像豁辉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舀患,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容