iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
自我挑戰組

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

Day05. runserver,怎麼run起來的?真相是!?part.2

  • 分享至 

  • xImage
  •  

前言

接續上回,我們終於走到了感覺像真的要把server run起來的地方了!畢竟function名稱都直接叫run了!
那今天我們就繼續挖,挖到底看到底會長怎麼樣吧!!

正題

接續上集的圖,今天會集中在這張圖~
https://ithelp.ithome.com.tw/upload/images/20230920/201629056iZD7Q4rHe.png

昨天我們到了run()的階段,讓我們來看看~
https://ithelp.ithome.com.tw/upload/images/20230920/20162905Zvp3tUbsR4.png
那這邊會流向使用reloader因為我們python manage.py runserver並沒有要求他不要啟動autoreloader
https://ithelp.ithome.com.tw/upload/images/20230920/20162905jUSwhKy1TW.png
我挖
https://ithelp.ithome.com.tw/upload/images/20230920/20162905NlHu5hFgub.png
這邊會看到幾個重點(路徑為django.utils.autoreload.py

  • signal
  • get_reloader()
  • start_django()

我們一個一個看
signal先來
他怎麼來的呢,往上看會發現
https://ithelp.ithome.com.tw/upload/images/20230920/20162905s20cMGne5f.png
是內建函式庫呢,看來直接google比較快~
python的官方文件
簡單的理解大概是當python接收到訊號signal.SIGTERM會去執行後面的lambda
https://ithelp.ithome.com.tw/upload/images/20230920/20162905l8yEutMyHj.png
lambda中的sys.exit(0)則是讓這支程序退出

接下來是
get_reloader()
https://ithelp.ithome.com.tw/upload/images/20230920/20162905rp2gBzZ1IP.png
這邊會看到兩條路WatchmanReloaderStatReloader,兩個都是會去紀錄並關心Django的健康狀況,之後看有沒有機會來說明,今天的重點依舊是runserver

最後是
start_django()
https://ithelp.ithome.com.tw/upload/images/20230920/20162905d6jxXe6aNA.png
這邊可以看到Django額外開了一個thread是for main_func的,至於thread是什麼呢?可能還會提到process,網路上有很多詳細的資料可以查閱這邊就不獻醜了
我們回過頭來看main_func是什麼呢?
https://ithelp.ithome.com.tw/upload/images/20230920/20162905jUSwhKy1TW.png
哦~是在進去autoreload之前的runserver裡面的function啊~
那這個self.inner_run做了哪些事情呢?
我們直接來看重點!
https://ithelp.ithome.com.tw/upload/images/20230920/201629059Mtp7dLi6K.png
這邊兩個重點

  • get_handler()
  • run()

首先
get_handler()
https://ithelp.ithome.com.tw/upload/images/20230920/201629050kLwRZ9ypz.png
再挖
https://ithelp.ithome.com.tw/upload/images/20230920/20162905cdwTOrHyMF.png
這邊我們可以看到他會去拿我們startproject後生出來的wsgi.py
我挖wsgi.py
https://ithelp.ithome.com.tw/upload/images/20230920/201629050iwhce5Wnd.png
我再挖get_wsgi_application()
https://ithelp.ithome.com.tw/upload/images/20230920/201629058X9IUoDKS2.png
這邊可以看到django.setup()然後return WSGIHandler(),這兩個坑之後會補起來的!
至此我們可以知道get_handler()return WSGIHandler()

接下來換
run()
https://ithelp.ithome.com.tw/upload/images/20230920/201629052JQP8Ccpxi.png
關鍵字來

  • WSGIServer
  • WSGIRequestHandler
  • set_app()
  • serve_forever()

WSGIServerWSGIRequestHandler
https://ithelp.ithome.com.tw/upload/images/20230920/20162905IezZtR1oNn.png
這邊我們看關鍵字simple_server就好了(WSGIRequestHandler也是去繼承simple_server的類別)
https://ithelp.ithome.com.tw/upload/images/20230920/20162905xnARHcAcO8.png
摁~wsgiref也是個python的內建函式庫
官方文件可以看到有提供簡單的起一個server的範例
wsgiref的範例中就可以看到set_app()serve_forever()的身影~

至此大概的流程就走到這邊,而python manage.py runserver最後就是由wsgiref啟動的!

結語

其實當中還是有很多地方可以去深探,但我這邊就是講一個菜鳥看源碼的感覺,可以看到平常使用的python manage.py runserver到底做了多少事情,可以說越挖越深,但挖的越深我越開心呀!


上一篇
Day04. 所以說runserver,阿server怎麼run的!?part.1
下一篇
Day06. settings 注入!
系列文
打掉重練!Django的還債之旅~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言