PyCon Taiwan 2021 與會隨筆
PyCon Taiwan 2021:大會之後會將影片上傳至 Youtube
Day 1
成功地測試失敗
需求是要修理某個折扣的邏輯,但講者發現 api 傳來的資料是 list,猜測可能會傳過來不只一組折扣,所以用「迭代 list 中所有項目」的方式處理。上線後發現,果然沒猜錯,會傳過來不只一組折扣。如果當時沒有迭代整個 list,而只處理 list[0] 這組折扣,那就又要修 bug 了。
使用 Pytest 進行單元測試
python 內建 unitest 模組。pytest 套件支援 unitest 的 test case,在使用上 pytest 的語法比較方便,功能也比較強大。
參考書:The Art of Unit Testing
-
出口驗證有三種:
檢查函式的 output
檢查函式的 private property。若沒有 getter 可存取該 property,會比較麻煩一點。不過 python 沒有真正的 private property,處理起來比較容易。
函式的 return 就是呼叫外部 api。此時可以模擬外部 api,並記錄函式如何呼叫 api,這樣就能檢查呼叫的方式是否正確。
以前沒有想過「exception也要測試」這件事
原來測試碼覆蓋率,是有套件可以幫我們計算的。
Lightning Talks
-
Patrick:用 Python 解決 iOS 14 之亂所帶來的數位廣告問題
塔圖科技針對「第三方 cookie 停用,網站需要在後端把資料送去給 FB」而推出了一個解決方案,讓網站不需要更動後端的程式碼,就可以送資料給 FB。我目前主要是學習網站後端的技能,這個消息透露了,第三方 cookie 停用,替代方案可能會需要由網站的後端工程師完成。
-
DennySORA:挖掘 asyncio 時的 try, except, else 與 finally 的小發現
原來 try-except-finally ,在不同的地方 return,會出現各種意料之外的效果。嚇得我立刻去搜尋到這篇文章 Python: 浅析 return 和 finally 共同挖的坑。雖然看得似懂非懂,但感覺 dis 這個套件好厲害啊,如果哪天需要研究編譯器(或直譯器?),或許用得上?
之前學 javascript 時學到非同步語法,但是學習 flask 期間,似乎都沒用到非同步語法,有點好奇 python 版的非同步語法會是什麼。後來偶然瞥見有個東西叫 asyncio,但還沒有研究過,今天聽這個閃電秀,才知道其中的眉角不少啊
Day 2
爬蟲與反爬蟲乾貨
如果發現某個網頁有很多爬蟲的流量,其實可以考慮將資訊做成付費 api,而不是直接跟爬蟲槓上,做出許多防堵爬蟲的機制。
爬蟲的兩個方式:request(優點:不會真的去載入圖片等等資源)、模擬使用者行為的 selenium
反爬蟲的機制:網頁加上空白 div、動態 class name、登入才能取用資源、圖片驗證碼、圖片驗證或算數驗證
爬蟲對付動態 class name:xpath
爬蟲對付圖片驗證碼:tesseract、機器學習
使用 Python 實現可即時互動用的遠端影音傳輸
-
HLS:將影像切成小封包,用 cdn 傳送,可支援大量人數同時上線,但會有 30 秒至 3 分鐘的延遲。
WebRTC:拓墣網路,能同時上線的人數有限,延遲時間較 HLS 短。
Peer to peer communication。不同私有網域裡的兩台電腦如何互傳訊息:Network Address Translator(NAT)。
從 Flask 邁向 FastAPI 的心路歷程
multi-thread 的 GIL 限制 in CPU bound(不過用非同步,不一定能改善運算時間,並且要留意 race condition)
-
WSGI:同步溝通協議規範(Flask)
ASGI:非同步溝通協議規範(FastAPI)
-
定義路由
FastAPI:method.route
FlaskRESTful:以 Resource 為單位建立 route
-
api 文件
FastAPI:自動生成文件
FlaskRESTful:可使用 Flask-RestPlus
-
檢查 input/output
FastAPI:用 type hits 和 pydantic 檢查,比較靈活
Flask:可使用 marshmallow
FlaskRESTful:可以在 Resource 裡做基本檢查,靈活度低
嫌 Django 的 Validator 不好用 !? 不如自幹一個
-
Django Validator 的缺點
跟 model、form 綁在一起
無法檢查多個欄位之間的平行關係。例如 A 欄位和 B 欄位,要嘛同時有值,要嘛同時沒有值;A、B、C 欄位其中一個有值時,D 欄位可以有值
validator 的行為不直覺。例如,model 的 validator 要自己手動呼叫,而且要設定某個參數欄位是 true,這樣檢查沒通過時才會拋出例外。沒有手動呼叫的話,錯誤的資料,不會觸發任何提醒就直接存進資料庫。
講者 Kilik Kuo 自製的 data-spec-validator
Comments
Post a Comment