iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

打掉重練!Django的還債之旅~系列 第 8

Day08. Request來了 ! 我接!

  • 分享至 

  • xImage
  •  

前言

不知道大家有沒有聽過這個面試題目,『當你的瀏覽器輸入網址後會發生什麼事情?』,據說工程師的每個階段都可以想想看怎麼回答這個問題,而每個階段思考的廣度和深度都會不太一樣,聽起來都有點像心理測驗了~那今天就是要來看看我的Django runserver後,我打開瀏覽器到我們指定的url位置後究竟會發生什麼事情呢?他又是怎麼徜徉Django的呢?今天就來挖挖看吧!

正題

究竟怎麼去接request的呢?是透過wsgiref這個python的lib,我們在runserver那邊也有提到過,位置在這邊django.core.servers.basehttp.py中的run
https://ithelp.ithome.com.tw/upload/images/20230923/20162905wYWwYUzPRi.png
這邊是我們在runserver的最後面真的啟動server的部分,而當中的
https://ithelp.ithome.com.tw/upload/images/20230923/20162905rCfO7uIMCj.png
set_app()就是去指定我們要接收request的地方~那個這handler怎麼來的,在往前回朔一下到django.core.management.commands.runserver.py中的inner_run
https://ithelp.ithome.com.tw/upload/images/20230923/20162905nORFoeMeH6.png
其中的self.get_handler()就是我們handler的來源,跟著這支function往前進最後就會看到一切的源頭handler就是WSGIHnadler()
https://ithelp.ithome.com.tw/upload/images/20230923/20162905oKdiQInJlA.png
而request進來django的時候就會去呼叫這個handler,所以我們可以看看__call__這個magic method
我們先來看看這兩個最重要的
https://ithelp.ithome.com.tw/upload/images/20230923/20162905Kwkw2JGEAy.png
夾帶environ也就是真正request送進來的資訊去new出一個WSGIRequest()
之後再把request包進get_response()裡面就會拿到response,看到這邊我已經開始覺得裡面一定發生了我無法想像的過程 XD
WSGIRequest就是讓扁平的request資料變成一個物件class的形式活在django中
get_response()做了些什麼呢?往裡面看發現是父類別BaseHandler的function繼承過去的而已
https://ithelp.ithome.com.tw/upload/images/20230923/20162905YX1rnXFgpl.png
摁~過一個self._middleware_chain()就得到response這麼神奇,這邊我們先當瞎子,self._middleware_chain()先當作沒看到,明天再挖看看~
那得到response後下面又做什麼呢?
https://ithelp.ithome.com.tw/upload/images/20230923/20162905gRQq9D3cWO.png
看起來是收集了statusheaders的資訊,然後餵給start_response()
而這個start_response()wsgiref的寫法,實際去查了一下發現好像是會去驗證headers如果當中發生了errors就會去改變status的狀態~(這邊實際情況我還在查閱資料中,如果有人知道的話歡迎下方留言!!)

那到這邊大概就是request進去django在變成response的大致流程囉~依舊來畫個圖
https://ithelp.ithome.com.tw/upload/images/20230923/20162905Y3MFWBTBCK.png

結語

今天的重點在request的進來跟出去,而request的加工廠middleware我們就留到明天再來看看吧,不只middleware我們還要找到他是如何去對其我們的urls.py然後把我們自己寫的view function拋出去也要找找~
/images/emoticon/emoticon76.gif


上一篇
Day07. 正常一點的Django長這樣~
下一篇
Day09. request加工廠"middleware"~
系列文
打掉重練!Django的還債之旅~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言