iot期末專題

Tags
Last edited
Dec 6, 2022 02:39 PM
 
call restful api internal
單元測試
相對路徑的匯入
 

CORS (Cross Origin Resource Sharing)


在實作一個前後端分離的項目的時候,可能經常會需要處理不同來源的請求。例如前端的sever架在5000port(用來處理靜態資源),而後端的server架再8000port。如果直接使用jsfetch去對後端的內容進行存取,可能會直接被瀏覽器擋下來,因為在定義中同源必須滿足以下三個條件:
  1. 相同的通訊協定 (protocol),即 http/https
  1. 相同的網域 (domain)
  1. 相同的通訊埠 (port) 最常見的問題所在
 
基本上在前後端分離的狀況下就一定會遇到要在不同的port中進行通訊的情況,這個時候除了使用proxy進行代理,就是在伺服器端設定cors來允許跨來源的請求
 
如果我們什麼都不做,就直接用fetch存取後端的api的時候,
notion image
如果我們把fetchResponse物件log出來的時候會發現它的body裡面是空的(即便在我們確定後端的server有發出內容,也無法受到),這個時候的Response物件是不透明的(status:0 ,type :opaque),這種情況下,就算伺服器真的有返回內容,瀏覽器也會因為考量到安全性的原因,直接讓這個請求失效(所以才會出現我們遇到的問題)。
 
CORS驗證的流程:
  1. 前端fetch(將Origin放進head)
  1. 後端產生回應
  1. 瀏覽器比對回應的head裡面的Access-Control-Allow-Origin:是否與Origin符合,如果不符合就會出現我們Response直接失效的情況
 
所以看到這個流程之後我們要做的事情也就很清楚了,就是在後端伺服器產生回應的時候,在head裡面加入Access-Control-Allow-Origin:參數,並且允許我們信任的來源就可以解決問題了。
 
*補充一點
notion image
如果我們將fetchmode設定為no-cors,也就是我們會略過錯誤,不會跑到capture那邊,但是我們一樣無法解析返回的資料,而如果設定為cors,我們也就會在瀏覽器的console裡面看到以上的錯誤內容。
 
所以為了為請求放行,在後端的部分我們使用flask_cors來協助進行cors的驗證。
 
 
 

js fetch 問題

 
notion image
因為還不太了解jsfetch promise的原理,再加上fetch使用的then裡面是用箭頭函式。所以目前想不到方法進行將fetch裡面的data return到上級的function中作為返回值。
最後是使用全域變數進行傳遞,然後再將load_data設為async function,最後在需要使用的地方await它,但不確定有沒有更好的方法進行處理
 
 

關於Multiprocessing

並行兩次yolo的結果
notion image
 
順序進行兩次yolo的結果
notion image
 
可以發現兩者其實差異不大
 
 
同樣的情況,將目標要執行的yolo次數拉到4次,就會發現使用multiprocessing的明顯變慢,這次我推測是因為核心的數量,在python中每一個cpu只能有一個進程process,而M1 mac的cpu雖然是8核心,但是確實4個p核心和4個e核心的架構,所以有可能是因為分配到e和核心的關係導致整體變慢(也可能單純因為資源不夠)
這裡因為python中的process每一次跑一個新進程的時候,都會重新匯入所有的lib(想到於將主程式重新跑一遍),所以每一個進程都需要重新載入一次模型(載入時間遠大於單次的推論時間),而在順序的版本因為只需要載入一次所以時間的影響很小
notion image
notion image
 

參考資料