call restful api internal
單元測試
相對路徑的匯入
CORS (Cross Origin Resource Sharing)
在實作一個前後端分離的項目的時候,可能經常會需要處理不同來源的請求。例如前端的
sever
架在5000
的port
(用來處理靜態資源),而後端的server
架再8000
的port
。如果直接使用js
的fetch
去對後端的內容進行存取,可能會直接被瀏覽器擋下來,因為在定義中同源必須滿足以下三個條件:- 相同的通訊協定 (protocol),即 http/https
- 相同的網域 (domain)
- 相同的通訊埠 (port) 最常見的問題所在
基本上在前後端分離的狀況下就一定會遇到要在不同的port中進行通訊的情況,這個時候除了使用proxy進行代理,就是在伺服器端設定cors來允許跨來源的請求
如果我們什麼都不做,就直接用fetch存取後端的api的時候,
如果我們把
fetch
的Response
物件log
出來的時候會發現它的body
裡面是空的(即便在我們確定後端的server
有發出內容,也無法受到),這個時候的Response物件是不透明的(status:0 ,type :opaque),這種情況下,就算伺服器真的有返回內容,瀏覽器也會因為考量到安全性的原因,直接讓這個請求失效(所以才會出現我們遇到的問題)。CORS驗證的流程:
- 前端fetch(將Origin放進head)
- 後端產生回應
- 瀏覽器比對回應的head裡面的
Access-Control-Allow-Origin:
是否與Origin符合,如果不符合就會出現我們Response直接失效的情況
所以看到這個流程之後我們要做的事情也就很清楚了,就是在後端伺服器產生回應的時候,在head裡面加入
Access-Control-Allow-Origin:
參數,並且允許我們信任的來源就可以解決問題了。*補充一點
如果我們將
fetch
的mode
設定為no-cors
,也就是我們會略過錯誤,不會跑到capture
那邊,但是我們一樣無法解析返回的資料,而如果設定為cors
,我們也就會在瀏覽器的console
裡面看到以上的錯誤內容。所以為了為請求放行,在後端的部分我們使用
flask_cors
來協助進行cors
的驗證。js fetch 問題
因為還不太了解
js
的fetch promise
的原理,再加上fetch
使用的then
裡面是用箭頭函式。所以目前想不到方法進行將fetch
裡面的data return
到上級的function
中作為返回值。最後是使用全域變數進行傳遞,然後再將load_data設為async function,最後在需要使用的地方await它,但不確定有沒有更好的方法進行處理
關於Multiprocessing
並行兩次yolo的結果
順序進行兩次yolo的結果
可以發現兩者其實差異不大
同樣的情況,將目標要執行的yolo次數拉到4次,就會發現使用multiprocessing的明顯變慢,這次我推測是因為核心的數量,在python中每一個cpu只能有一個進程process,而M1 mac的cpu雖然是8核心,但是確實4個p核心和4個e核心的架構,所以有可能是因為分配到e和核心的關係導致整體變慢(也可能單純因為資源不夠)
這裡因為python中的process每一次跑一個新進程的時候,都會重新匯入所有的lib(想到於將主程式重新跑一遍),所以每一個進程都需要重新載入一次模型(載入時間遠大於單次的推論時間),而在順序的版本因為只需要載入一次所以時間的影響很小