iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
自我挑戰組

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

Day17. migrate發送了信號signal!?

  • 分享至 

  • xImage
  •  

前言

今天的內容我只能說我自己也沒有把握說真的理解了,就算了解了程式在寫什麼,也還沒達到可以理解為什麼這樣寫!話不多說,趕緊走著!

正題

今天先從上次沒能理解的地方開始
https://ithelp.ithome.com.tw/upload/images/20231002/20162905jCT41RbHje.png
這個是django有一個寫法叫做signal,顧名思義是一個傳送信號的function,而信號能做什麼事呢,接著看
https://ithelp.ithome.com.tw/upload/images/20231002/20162905qEQJvGdcVW.png
看到這邊django會根據django settings中INSTALLED_APPS的AppConfig來去分送分別的信號給該app所擁有的信號接收者,接收者在哪,我們接著看
https://ithelp.ithome.com.tw/upload/images/20231002/201629056fcbbE8sU4.png
這裡面就會把信號signal送給接收者receiver囉!
而receiver當中又有使用到python函式庫weakref,weakref也是滿有趣的可以解決掉一些python麻煩的問題,像是circular等等問題相關文章google可以找很多,參考文章
那這個receiver又是什麼時候被設置的呢?而他又會觸發什麼樣的function呢?
其實早在MigrationExecutor init中的MigrationRecorder那邊就被設置了
被django當中的apps
https://ithelp.ithome.com.tw/upload/images/20231002/20162905lVm16HyEX1.png
而這個會去跑所有AppConfig的ready function
https://ithelp.ithome.com.tw/upload/images/20231002/20162905PDSY6gtWck.png
那我們再來看ready中有什麼存在吧
經過我一番搜索,在ContentTypesConfig中找到了ready跟pre_migrate有關的地方
https://ithelp.ithome.com.tw/upload/images/20231002/20162905MtQPJE0BhY.png
https://ithelp.ithome.com.tw/upload/images/20231002/20162905sw3S90HDCc.png
connect在ready的時候設置,而在send的時候被觸發,大概是這種感覺吧!
這邊是看migrate相關的signal,django還有設置其他的signal,當然也可以自定義詳細可以自行google或看這邊大江狗
大概了解了signal的運作後,我們繼續往下走吧!(每個app都有自己的pre post migrate有興趣的也可以嘗試自己讀讀看找找看,這邊就不詳細的一個一個介紹了,還是之後篇幅不夠再拿來介紹XD)
再來終於到了migrate至db的地方
https://ithelp.ithome.com.tw/upload/images/20231002/201629057wgW6Kus4r.png
今天就當我補坑,明天再接續著看看migrate吧~(稍微看了一下篇幅好像挺長的XD

結語

今天的圖大概長這樣
https://ithelp.ithome.com.tw/upload/images/20231003/20162905iY3oyj4wGo.png

本日關鍵字

  • django signal
  • python weakref

migrate這個指令真的跟太多相關的物件有關聯了,追原始碼的過程中很容易不小心就迷路了,或者是突然忘記那個變數是什麼東東,通常都直接print出來看看就好了,但有時候print出來的和自己想的不一樣就要回去重找XD這也算是python的特性之一吧!


上一篇
Day16. migrate 接著走遇到演算法~
下一篇
Day18. migrate終於走到db啦!
系列文
打掉重練!Django的還債之旅~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言