作者:麥克煎蛋 出處:https://www.cnblogs.com/mazhiyong/ 轉載請保留這段聲明,謝謝!
在整理工程模板的時候,有一個場景是當請求過來的時候,要對請求統一進行權限驗證。
如果驗證通過,那么就把驗證過的用戶信息附加到Request中,這樣在具體的路徑操作里,就可以直接使用用戶信息,而不用再次查詢當前用戶。
同時還有一個好處是減少了重復代碼量,將以前的在路徑操作部分的權限驗證統一提取到中間件里實現,一次實現即可。
最開始的嘗試是想把數據附加到request.session中,但后來經過多次嘗試,發現在中間件部分是無法成功的。
后來經過查詢文檔,發現可以把數據附加到request.state中,從而完美的解決了這個問題。
@app.middleware("http") async def process_authorization(request: Request, call_next): """ 在這個函數里統一對訪問做權限token校驗。 1、如果是用戶注冊、登陸,那么不做token校驗,由路徑操作函數具體驗證 2、如果是其他操作,則需要從header或者cookie中取出token信息,解析出內容 然后對用戶身份進行驗證,如果用戶不存在則直接返回 如果用戶存在則將用戶信息附加到request中,這樣在后續的路徑操作函數中可以直接使用。 """ start_time = time.time() # print(request.url) # print(request.url.path) if request.url.path == '/login' or request.url.path == '/register': logger.info('no jwt verify.') else: logger.info('jwt verify.') result = Auth.identifyAll(request) if result['status'] and result['data']: user = result['data']['user'] logger.info('jwt verify success. user: %s ' % user.username) # state中記錄用戶基本信息 request.state.user = user else: return JSONResponse(content=result) response = await call_next(request) process_time = time.time() - start_time response.headers["X-Process-Time"] = str(process_time) return response