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

2021-03-02 Python Web與Django開發

本文是Django經典面試問題與答案系列的中篇,如果還未讀過第一篇的,請點擊這裡。小編精心收集,希望對大家學習和工作有所幫助,歡迎轉載點讚啊。

11. 簡單說說看 Django的CSRF防禦機制

Django的CSRF保護主要是通過django.middleware.csrf.CsrfViewMiddleware中間件來實現的。主要流程如下:

Django 第一次響應來自某個客戶端的get請求時,會在伺服器端隨機生成一個 csrftoken(一串64位的隨機字符串),把這個 token 放請求頭的 cookie 裡返回給用戶。

所有通過POST方式提交的表單在渲染時中必須包含一個 csrfmiddlewaretoken 隱藏欄位 (在模板中通過{% csrf_token %}標籤生成)。

當用戶通過POST提交表單時,Django會從請求頭cookie取csrftoken這一項的值,再從POST表單裡取csrfmiddlewaretoken交由中間件進行校驗兩者是否一致。如果一致表明這是一個合法請求,否則返回403 Forbidden.

注意csrftoken和csrfmiddlewaretoken並不是簡單相等的兩個字符串,而是通過算法判斷是否一致相等的,如下圖所示。

12. Django中使用AJAX發送POST請求時如何通過CSRF認證?

1. 第一種方式直接在發送數據中加入csrfmiddlewaretoken

<script>
$("#btn").on("click",function () {
$.ajax({
url:"/some_url/",
type:"POST",
data:{
csrfmiddlewaretoken:{{ csrf_token }}, //寫在模板中,才會被渲染
},
success:function (data) {
}
})
})
</script>

2.通過jquery選擇器獲取csrfmiddlewaretoken

<script>
$("#btn").on("click",function () {
$.ajax({
url:"/some_url/",
type:"POST",
data:{
csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val(),
},
success:function (data) {
}
})
})
</script>

3. 使用jquery.cookie.js調用請求頭cookie中的csrftoken

<script src="/static/jquery.cookie.js"></script> //必須先引入它
<script>
$("#btn").on("click",function () {
$.ajax({
url:"/some_url/",
type:"POST",
headers:{"X-CSRFToken":$.cookie('csrftoken')},
data:$("#f1").serialize()
}
)
})
</script>

更多閱讀

Django基礎(17): 如何上傳處理文件及Ajax文件上傳示範(附GitHub源碼)

Django實戰: 利用AJAX技術實現博文實時搜索

13. 什麼情況下需要使用select_related和prefetch_related方法以及兩者的區別

當你查詢單個主對象或主對象列表並需要在模板或其它地方中使用到每個對象的關聯對象信息

時,請一定記住使用select_related和prefetch_related一次性獲取所有對象信息,從而提升

資料庫查詢效率,避免重複查詢。兩個方法都是Django ORM優化數據查詢必須要熟練掌握

的方法。

兩者的區別是:

對單對單(OneToOne)或單對多外鍵(ForeignKey)欄位,使用select_related方法

對於多對多欄位(ManyToMany)和反向外鍵關係,使用prefetch_related方法

select_related方法執行一次資料庫查詢,prefetch_related方法執行兩次資料庫查詢

使用Prefetch方法可以給prefetch_related方法額外添加額外條件和屬性。

更多閱讀

Django基礎(29):select_related和prefetch_related的用法與區別

14. 如何從數據表中獲取一個隨機對象?

可以使用order_by('?').first()隨機獲取一個對象

def get_random_object():
return MyModel.objects.order_by("?").first()

更多閱讀

Django ORM Cookbook精選摘錄(上)

15. 說說看aggregate和annotate方法的作用並舉幾個例子

aggregate的中文意思是聚合, 源於SQL的聚合函數。Django的aggregate()方法作用是對一組值

(比如queryset的某個欄位)進行統計計算,並以字典(Dict)格式返回統計計算結果。

django的aggregate方法支持的聚合操作有AVG / COUNT / MAX / MIN /SUM 等。

Student.objects.aggregate(Avg('age『), Max('age『), Min('age『))

# 同時獲取學生年齡均值, 最大值和最小值, 返回字典

{ 'age__avg': 12, 'age__max': 18, 'age__min': 6, }

Hobby.objects.aggregate(Max('student__age'))

# 根據Hobby反查學生最大年齡。查詢欄位student和age間有雙下劃線哦。

{ 'student__age__max': 12 }

annotate的中文意思是注釋,一個更好的理解是分組(Group By)。如果你想要對數據集先進行分組然後再進行某些聚合操作或排序時,需要使用annotate方法來實現。與aggregate方法不同的是,annotate方法返回結果的不僅僅是含有統計結果的一個字典,而是包含有新增統計欄位的查詢集(queryset).

# 按學生分組,統計每個學生愛好數量,並自定義欄位名

Student.objects.annotate(hobby_count_by_student=Count('hobbies'))

# 按愛好分組,再統計每組學生數量。

Hobby.objects.annotate(Count('student'))

# 按愛好分組,再統計每組學生最大年齡。

Hobby.objects.annotate(Max('student__age'))

# 先按愛好分組,再統計每組學生數量, 然後篩選出學生數量大於1的愛好。

Hobby.objects.annotate(student_num=Count('student')).filter(student_num__gt=1)

# 先按愛好分組,篩選出以'd'開頭的愛好,再統計每組學生數量。

Hobby.objects.filter(name__startswith="d").annotate(student_num=Count('student『))


更多閱讀

Django基礎(24): aggregate和annotate方法使用詳解與示例

16. Django中如何使用redis做緩存?

安裝好redis後,你需要安裝django-redis才能在django中使用redis。django-redis安裝命令如下:

settings.py中加入以下內容配置緩存。your_host_ip換成你的伺服器地址,yourpassword換成你的伺服器登陸密碼。

CACHES = {

    'default': {

        'BACKEND': 'django_redis.cache.RedisCache',

        'LOCATION': 'redis://your_host_ip:6379',

        "OPTIONS": {

            "CLIENT_CLASS": "django_redis.client.DefaultClient",

             "PASSWORD": "yourpassword",

        },

    },

}

你還可以在settings.py設置緩存默認過期時間(非必須)

REDIS_TIMEOUT=7*24*60*60

更多閱讀

Django中如何使用Redis進行緩存詳細教程(含Windows系統下安裝redis)

17. Django項目上傳到代碼庫時是否需要忽略資料庫遷移文件?

資料庫遷移文件位於每個app文件夾的migrations文件夾裡,這些文件記錄了模型的創建與改

動。每次當你創建模型或對模型欄位進行修改,然後運行python manage.py

makemigrations命令時都會有新的遷移文件產生。Django官方文檔特別說明這些遷移文件

屬於Django項目代碼中很重要的一部分,不應刪除或忽略,所以建議上傳。

更多閱讀

Django項目上傳.gitignore文件建議忽略文件清單及是否需要忽略資料庫遷移文件

18. 如何在模板中獲取當前訪問url地址

在模板中你可以使用{{ request.path }}獲取當前url,如果要獲取帶querystring的完整url你可以使用{{ request.get_full_path }}。如果你要獲取完整絕對路徑,你可以使用 {{ request.build_absolute_uri }}。具體使用方法如下所示:

https://jackeygao.io/search/?keyword=django

Method

Output

request.path

/search/

request.get_full_path

search/?keyword=django

request.build_absolute_uri

https://jackeygao.io/search/?keyword=django

19. 使用F方法更新一個對象或多個對象的某個欄位有什麼優點?

通常情況下我們在更新數據時需要先從資料庫裡將原數據取出後放在內存裡,然後編輯某些欄位或屬性,最後提交更新資料庫。使用F方法則可以幫助我們避免將所有數據先載入內存,而是直接生成SQL語句更新資料庫。

假如我們需要對所有產品的價格漲20%,我們通常做法如下。當產品很少的時候,對網站性能沒影響。但如果產品數量非常多,把它們信息全部先載入內存會造成很大性能浪費。

products = Product.objects.all()
for product in products:
product.price *= 1.2
product.save()

使用F方法可以解決上述問題。我們直接可以更新資料庫,而不必將所有產品載入內存。

from django.db.models import F

Product.objects.update(price=F('price') * 1.2)

我們也可以使用F方法更新單個對象的欄位,如下所示:

product = Product.objects.get(pk=5009)
product.price = F('price') * 1.2
product.save()

但值得注意的是當你使用F方法對某個對象欄位進行更新後,需要使用refresh_from_db()方法後才能獲取最新的欄位信息(非常重要!)。如下所示:

product.price = F('price') + 1
product.save()
print(product.price) # <CombinedExpression: F(price) + Value(1)>
product.refresh_from_db()
print(product.price) # Decimal('13.00')

20. 說說 nginx 和 uWISG 伺服器之間如何配合工作的?

首先瀏覽器發起 http 請求到 nginx 伺服器,Nginx 根據接收到請求包,進行 url 分析,

判斷訪問的資源類型。如果是靜態資源,直接讀取靜態資源返回給瀏覽器。

如果請求的是動態資源就轉交給 uwsgi伺服器。

uwsgi 伺服器根據自身的uwsgi 和 WSGI 協議,找到對應的 Django 框架。

Django 框架下的應用進行邏輯處理後,將返回值發送到 uwsgi 伺服器。

uwsgi 伺服器再返回給 nginx,最後 nginx將返回值返回給瀏覽器進行渲染顯示給用戶。

未完待續

喜歡本文的,歡迎收藏和點讚。希望獲得更多乾貨的,別忘了關注我們的微信公眾號【Python Web與Django開發】並加星標哦。

大江狗

2020.4.19

相關焦點

  • 2020下半年教師資格證面試試題及答案匯總
    江西教師考試網同步江西華圖招聘信息:2020下半年教師資格證面試試題及答案匯總,報名時間:,請考生多加關注。更多關於2020教師,教師面試,教師資格面試,面試試題,江西教師招聘考試的內容,請關注(江西教師招聘考試頻道/江西人事考試網)!加入官方交流群(
  • 最新無領導小組討論答案_2020年廣東公務員面試什麼時候開始
    最新無領導小組討論答案_2020年廣東公務員面試什麼時候開始由廣東公務員考試網考試快訊欄目由提供,更多關於廣東省考無領導小組面試,廣東公務員考試快訊的內容,請關注廣東公務員考試頻道/廣東公務員考試網!
  • Django限制表單中ForeignKey對應下拉菜單選項數量的兩種經典方法
    小編我今天就提供兩種經典方法供參考。如果不出意外,Django模型models.py應該是如下所示:from django.db import modelsfrom django.contrib.auth.models import Userclass Article(models.Model): """文章模型""" title = models.CharField
  • 螞蟻莊園2020年12月9日最新題目答案匯總
    這些都是螞蟻莊園2020年12月9日的題目,那麼你們知道答案是什麼嗎?下面小編就為玩家帶來螞蟻莊園小課堂12.9最新答案匯總吧。螞蟻莊園小課堂12.9今日題目答案匯總01螞蟻莊園2020年12月9日題目匯總1、12月9日:成語「鼎力相助」一般可以用於?
  • 螞蟻莊園2020年12月18日最新題目答案匯總
    這些都是螞蟻莊園2020年12月18日的題目,那麼你們知道答案是什麼嗎?下面小編就為玩家帶來螞蟻莊園小課堂12.18今日最新答案匯總吧。螞蟻莊園小課堂12.18今日最新題目答案01螞蟻莊園2020年12月18日題目匯總1、12月18日:豔陽天裡真的能「大雪紛飛」嗎?
  • 螞蟻莊園2020年12月16日最新題目答案匯總
    今天的冬日火鍋相關,這些都是螞蟻莊園2020年12月16日的題目,那麼你們知道答案是什麼嗎?下面小編就為玩家帶來螞蟻莊園小課堂12.16最新答案匯總吧。螞蟻莊園小課堂12.16今日最新題目答案01螞蟻莊園2020年12月16日題目匯總1、12月16日:宋朝人吃火鍋時,可以吃到以下哪種蔬菜?
  • 螞蟻莊園2020年12月22日最新題目答案匯總
    這些都是螞蟻莊園2020年12月22日的題目,那麼你們知道答案是什麼嗎?下面小編就為玩家帶來螞蟻莊園小課堂12月22日今日最新答案匯總吧。螞蟻莊園2020年12月22日題目匯總1、12月22日:下面關於電熱毯的說法,正確的是?
  • 螞蟻莊園2020年12月6日最新題目答案匯總
    這些都是螞蟻莊園2020年12月6日的題目,那麼你們知道答案是什麼嗎?下面小編就為玩家帶來螞蟻莊園小課堂12.6最新答案匯總吧。螞蟻莊園小課堂12.6今日最新題目答案匯01螞蟻莊園2020年12月6日題目匯總1、12月6日:雪天路滑如果不慎向前跌倒用手撐地是最好的方法嗎?
  • 無領導面試問題及答案大全_2020廣東面試公告
    無領導面試問題及答案大全_2020廣東面試公告由廣東公務員考試網考試快訊欄目由提供,更多關於廣東公務員無領導面試,廣東公務員考試快訊的內容,請關注廣東公務員考試頻道/廣東公務員考試網!
  • 無領導小組討論經典案例_2020廣東省考面試真題答案
    無領導小組討論經典案例_2020廣東省考面試真題答案由廣東公務員考試網考試快訊欄目由提供,更多關於廣東省考無領導小組面試,廣東公務員考試快訊的內容,請關注廣東公務員考試頻道/廣東公務員考試網!
  • 最新!Top 100大學面試要求匯總!附30+經典問題&回答思路
    今天棕櫚君就為大家匯總了Top 100大學面試要求,並分享4大面試注意事項及6大類常見面試問題&回答思路,希望能夠幫助大家更高效地備戰申請!* 相關信息時有變動,最新要求請以官網為準。了解了Top 30名校面試方面的要求後,想要實現一個完美的面試,我們具體該如何做準備呢?
  • 結構化小組面試經典套話_廣東省考真題及答案
    結構化小組面試經典套話_廣東省考真題及答案由廣東公務員考試網考試快訊欄目由提供,更多關於廣東公務員無領導面試,廣東公務員考試快訊的內容,請關注廣東公務員考試頻道/廣東公務員考試網!
  • 2016年國家公務員面試技巧:15個經典面試問題回答思路之「談談你的...
    下面,中公教育為大家總結公務員面試技巧:15個經典面試問題回答思路之「談談你的家庭情況」。希望即將參加面試的考生們認真複習,考出理想成績。更多國家公務員面試技巧,請點擊國家公務員考試網。國家公務員面試過程中,面試官會向應聘者發問,而應聘者的回答將成為國家公務員面試官考慮是否接受他的重要依據。
  • 最新無領導小組討論答案_廣東公務員面試形式無領導
    最新無領導小組討論答案_廣東公務員面試形式無領導由廣東公務員考試網考試快訊欄目由提供,更多關於廣東省考無領導小組面試,廣東公務員考試快訊的內容,請關注廣東公務員考試頻道/廣東公務員考試網!
  • 螞蟻莊園2020年12月11日題目答案匯總
    今天的問題和生活中日常飲食相關,這些都是螞蟻莊園2020年12月11日的題目,那麼你們知道答案是什麼嗎?下面小編就為玩家帶來螞蟻莊園小課堂12.11最新答案匯總吧。螞蟻莊園2020年12月11日題目答案匯總01
  • 2020掌上英雄聯盟晉級考試問題答案匯總大全
    小編今天給各位玩家朋友帶來的是2020掌上英雄聯盟晉級考試問題答案匯總大全,很多的玩家朋友最近在問2020最新的掌上英雄聯盟考試問題的答案是什麼呢?小編把所有問題答案都給大家整理匯總了一下,感興趣的小夥伴們快來跟小編一起往下看看吧!
  • 無領導面試13個經典題目及答案_2020年廣東省考面試真題解析
    無領導面試13個經典題目及答案_2020年廣東省考面試真題解析由廣東公務員考試網考試快訊欄目由提供,更多關於廣東公務員無領導小組面試,廣東公務員考試快訊的內容,請關注廣東公務員考試頻道/廣東公務員考試網!
  • 2020年安徽教師資格面試考試試題答案查看
    2020年安徽教師資格面試考試試題答案查看由中小學教師資格證網考試快訊提供,以及提供2020安徽教師資格試題真題考試信息。更多關於2020年安徽教師資格面試考試試題答案查看,安徽教師資格面試,安徽教師資格試講,教師資格結構化試題快訊的內容,請關注安徽教師資格考試網!!
  • 2019年最新PHP經典面試題及答案,PHP程式設計師必看
    源 / php中文網      源 / www.php.cn2019年最新PHP經典面試題及答案,PHP程式設計師必看.相當於 error_reporting('E_ALL'); 輸出所有的錯誤7、打開php.ini中的Safe_mode,會影響哪些參數?至少說出6個。
  • 螞蟻莊園2020年11月28日題目答案匯總
    這些都是螞蟻莊園2020年11月28日的題目,今天的題目都和生活息息相關,那麼你們知道答案是什麼嗎?下面小編就為玩家帶來螞蟻莊園小課堂11.28最新答案匯總吧。螞蟻莊園2020年11月28日題目答案匯總01