日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

django render_2020年最新Django经典面试问题与答案汇总(下)大江狗整理

發(fā)布時間:2024/9/30 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django render_2020年最新Django经典面试问题与答案汇总(下)大江狗整理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

終于我們來到Django經(jīng)典面試問題與答案系列的終章了,在本章我們將分享最后10個常用有用的知識點(diǎn),也是面試時常問的經(jīng)典問題。如果你還沒有讀過本系列前兩篇文章的,可以點(diǎn)擊如下鏈接閱讀。

  • 2020年最新Django經(jīng)典面試問題與答案匯總(上)-大江狗整理

  • 2020年最新Django經(jīng)典面試問題與答案匯總(中)-大江狗整理

21. 說說看Django信號(Signals)的工作原理, 主要應(yīng)用場景及內(nèi)置信號

Django 提供一個了“信號分發(fā)器”機(jī)制,允許解耦的應(yīng)用在框架的其它地方發(fā)生操作時會被通知到。?通俗而講Django信號的工作原理就是當(dāng)某個事件發(fā)生的時候會發(fā)出一個信號(signals), 而監(jiān)聽這個信號的函數(shù)(receivers)就會立即執(zhí)行。Django信號的應(yīng)用場景很多,尤其是用于不同模型或程序間的聯(lián)動。常見例子包括創(chuàng)建User對象實(shí)例時創(chuàng)建一對一關(guān)系的UserProfile對象實(shí)例,或者每當(dāng)用戶下訂單時觸發(fā)給管理員發(fā)郵件的動作。

Django內(nèi)置信號包括:

  • django.db.models.signals.pre_save & post_save在模型調(diào)用 save()方法之前或之后發(fā)送。

  • django.db.models.signals.pre_init& post_init在模型調(diào)用_init_方法之前或之后發(fā)送。

  • django.db.models.signals.pre_delete & post_delete在模型調(diào)用delete()方法或查詢集調(diào)用delete() 方法之前或之后發(fā)送。

  • django.db.models.signals.m2m_changed在模型多對多關(guān)系改變后發(fā)送。

  • django.core.signals.request_started & request_finished Django建立或關(guān)閉HTTP 請求時發(fā)送。

更多閱讀:

Django基礎(chǔ)(31): 如何理解和正確使用Django信號(Signals)

22. 什么是中間件(middleware),中間件(middleware)的應(yīng)用場景

中間件(Middleware)是一個鑲嵌到django的request/response處理機(jī)制中的一個鉤子(hooks) 框架。它是一個可以修改django全局輸入或輸出的一個底層插件系統(tǒng)。

一個請求HttpRequest在傳遞給視圖View處理前要經(jīng)過中間件處理,經(jīng)過View處理后的響應(yīng)也要經(jīng)過中間件處理才能返回給用戶。我們可以編寫自己的中間件實(shí)現(xiàn)權(quán)限校驗(yàn),限制用戶請求、打印日志、改變輸出內(nèi)容等多種應(yīng)用場景,比如:

  • 禁止特定IP地址的用戶或未登錄的用戶訪問我們的View視圖函數(shù)

  • 對同一IP地址單位時間內(nèi)發(fā)送的請求數(shù)量做出限制

  • 在View視圖函數(shù)執(zhí)行前記錄用戶的IP地址

  • 在View視圖函數(shù)執(zhí)行前傳遞額外的變量或參數(shù)

  • 在View視圖函數(shù)執(zhí)行前或執(zhí)行后把特定信息打印到log日志

  • 在View視圖函數(shù)執(zhí)行后對reponse數(shù)據(jù)進(jìn)行修改后返回給用戶

更多閱讀

Django基礎(chǔ)(33): 中間件(middleware)的工作原理和應(yīng)用場景舉例

23. Django有哪些內(nèi)置中間件及每個中間件的作用

Django的settings.py里已經(jīng)注冊了一些自帶的中間件,每個中間件都負(fù)責(zé)一個特定的功能。

MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',]每個中間件的功能如下,建議都保留:
  • SecurityMiddleware:為request/response提供了幾種安全改進(jìn),無它不安全

  • SessionMiddleware:開啟session會話支持,無它無session

  • CommonMiddleware:基于APPEND_SLASH和PREPEND_WWW的設(shè)置來重寫URL,如果APPEND_SLASH設(shè)為True,并且初始URL 沒有以斜線結(jié)尾以及在URLconf 中沒找到對應(yīng)定義,這時形成一個斜線結(jié)尾的新URL;如果PREPEND_WWW設(shè)為True,前面缺少 www.的url將會被重定向到相同但是以一個www.開頭的url。

  • CsrfViewMiddleware:添加跨站點(diǎn)請求偽造的保護(hù),通過向POST表單添加一個隱藏的表單字段,并檢查請求中是否有正確的值,無它無csrf保護(hù)

  • AuthenticationMiddleware:在視圖函數(shù)執(zhí)行前向每個接收到的user對象添加HttpRequest屬性,表示當(dāng)前登錄的用戶,無它用不了request.user

  • MessageMiddleware:開啟基于Cookie和會話的消息支持,無它無message

  • XFrameOptionsMiddleware:對點(diǎn)擊劫持的保護(hù)

24. Django項(xiàng)目中什么時候使用中間件,什么時候使用裝飾器?

中間件和裝飾器均廣泛用于權(quán)限校驗(yàn),緩存和日志。中間件對Django的輸入或輸出的改變是全局的,而裝飾器一般只改變單個視圖的輸入輸出。如果讓你希望對Django的輸入或輸出做出全局性的改變時,需要使用中間件,否則使用裝飾器。

舉個例子,我們在裝飾器一文中介紹了如何使用@login_required裝飾器要求用戶必須先登錄才能訪問我們的某個視圖函數(shù)。試想我們有個網(wǎng)站絕大部分視圖函數(shù)都需要用戶登錄,每個視圖函數(shù)前面都需要加上@login_required裝飾器是比較傻的行為。借助于中間件,我們無需使用裝飾器即可全局實(shí)現(xiàn):只有登錄用戶才能訪問視圖函數(shù),匿名用戶跳轉(zhuǎn)到登錄頁面。實(shí)現(xiàn)原理也很簡單,在一個request到達(dá)視圖函數(shù)前,我們先對request.user是否驗(yàn)證通過進(jìn)行判斷,然后再進(jìn)行跳轉(zhuǎn)。

更多閱讀:

Django基礎(chǔ)(26): 常用裝飾器應(yīng)用場景及正確使用方法

一文看懂Python系列之裝飾器(decorator)(工作面試必讀)

25. 使用Celery執(zhí)行異步任務(wù)時如何給任務(wù)設(shè)置超時時間?

如果希望全局性地設(shè)置每個任務(wù)的超時時間,可以使用如下設(shè)置:

CELERYD_TASK_TIME_LIMIT = 10*60 #10分鐘

但如果你的項(xiàng)目中有多個任務(wù),但每個任務(wù)執(zhí)行的周期和執(zhí)行的耗時都不一樣,可以使用@task裝飾器的time_limit或soft_time_limit屬性來給每個任務(wù)設(shè)置超時時間。兩者區(qū)別是:

  • time_limit參數(shù)超時直接kill掉當(dāng)前worker;

  • soft_time_limit參數(shù)超時時會報錯而不會kill當(dāng)前worker,可以捕獲。

@app.task(name='tasks.main', bind=True, soft_time_limit=2, errback=error_fun)
def task_main(self, param):
try:
time.sleep(10)
except SoftTimeLimitExceeded as e:
print e

更多閱讀:

Django中使用Celery執(zhí)行異步和定時任務(wù)的注意事項(xiàng)

如何使用Django+Celery執(zhí)行異步任務(wù)和定時任務(wù)

26. 什么情況下需要自定義context_processors(上下文處理器)

當(dāng)你需要一個視圖函數(shù)或模板提供或設(shè)置全局變量時,你需要使用context_processors(上下文處理器)。我們在視圖和模板中可以隨意使用request這個對象作為變量,不需要額外傳遞,就是因?yàn)閐jango.core.context_processors.request把request變成了一個全局變量。

context_processors(上下文處理器)在很多場景下非常有用,舉個實(shí)際點(diǎn)的例子。一個博客的每篇文章詳情上都會有標(biāo)簽云,文章歸檔,友情鏈接等信息,這些信息每篇文章都是可以公用的信息。如果每一篇文章的DetailView都從數(shù)據(jù)庫查詢相關(guān)數(shù)據(jù)再返回給前端模板,這就造成了數(shù)據(jù)庫查詢的浪費(fèi),增加了服務(wù)器的負(fù)擔(dān)。如果把這些數(shù)據(jù)通過context_processors設(shè)置成全局變量,那么所有的視圖和模板都能夠直接訪問不需要再重復(fù)查詢數(shù)據(jù)庫了,是不是很帥?

我們稍后會講解如何自定義context_processors(上下文處理器),設(shè)置視圖和模板的全局變量,歡迎關(guān)注我們的微信公眾號【Python Web和Django開發(fā)】

27. Django如何生成靜態(tài)html文件

使用render_to_string方法生成content,然后寫入html文件。

from django.shortcuts import render
from django.template.loader import render_to_string
import os


def my_view(request):
context = {'some_key': 'some_value'}

static_html = '/path/to/static.html'

if not os.path.exists(static_html):
content = render_to_string('template.html', context)
with open(static_html, 'w') as static_file:
static_file.write(content)

return render(request, static_html)

28. Django項(xiàng)目如何實(shí)現(xiàn)高并發(fā)?

可以從如下幾個角度講:

  • 使用nginx進(jìn)行反向代理和負(fù)載均衡

  • 數(shù)據(jù)庫分庫和讀寫分離(含主從復(fù)制)

  • 使用nosql數(shù)據(jù)庫比如redis緩存熱點(diǎn)數(shù)據(jù)

  • 耗時任務(wù)(比如發(fā)郵件或?qū)懭氩僮?交由celery異步處理

  • 使用Gzip或django-compressor壓縮靜態(tài)文件

  • 使用CDN加速靜態(tài)文件訪問

29.??什么是wsgi,uwsgi,uWSGI?

WSGI?(Web Server Gateway Interface)

Web服務(wù)器網(wǎng)關(guān)接口,是一套協(xié)議。用于接收用戶請求并將請求進(jìn)行初次封裝,然后將請求交給web框架。實(shí)現(xiàn)wsgi協(xié)議的模塊有:

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

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

uwsgi:

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

uWSGI:

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

30. 列舉5個常用的Django第三方庫

答案不限于:

  • 第三方社交登錄:?django-allauth

  • 過濾器:?django-filter

  • 富文本編輯器:ckeditor

  • 調(diào)試debug工具:?django-debug-toolbar

  • 快速生成可以用于生產(chǎn)環(huán)境的項(xiàng)目目錄:cookiecutter

  • API工具:django rest framework

更多閱讀:

你應(yīng)該使用的10個流行的Django第三方包

你應(yīng)該使用的10個流行的Django第三方包

希望本文對大家有所幫助,喜歡的點(diǎn)贊啊。接下來小編我準(zhǔn)備分享些實(shí)戰(zhàn)項(xiàng)目,請關(guān)注我們的微信公眾號【Python Web與Django開發(fā)】并加星標(biāo)哦。

大江狗

2020.4.24

總結(jié)

以上是生活随笔為你收集整理的django render_2020年最新Django经典面试问题与答案汇总(下)大江狗整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。