在WebSocket路由使用依賴注入做權限控制結果FastAPI報錯。
最近把幾個FastAPI HTTP改成WebSocket連線,測試運作正常,但是加上權限控制相關設定後就掛了😞
一般是這樣用的:
python
manager = LoginManager(
secret= 'secret_key',
token_url='/auth/token',
use_cookie=True
)
@router.get('/example')
async def example(
user = Depends(manager)
):
但是改成WebSocket為啥就不行了? 因為FastAPI-Login的LoginManager在self.__call__的設計是需要Request物件來讀取cookie或header,但WebSocket handler沒有Request物件,所以嘗試依賴注入時就發生錯誤了。
怎麼辦?沒有Request,就生一個出來給它吧😬
python
from fastapi import Request, WebSocket
async def websocket_user(websocket: WebSocket):
fake_request = Request({
'type': 'http',
'headers': websocket.headers.raw
})
return await LoginManager.__call__(fake_request)
做一個假的Request把websocket.headers傳給LoginManager,就能在WebSocket做依賴注入啦:
python
from fastapi import WebSocket
@router.websocket('/example')
async def example(
websocket: WebSocket,
user = Depends(websocket_user)
):
await websocket.accept()
print(user)