點擊python編程從入門到實踐,置頂 公衆號重磅 python入門資料,第一時間送達python
讀完須要4分鐘面試
速讀僅需 2 分鐘編程
/ python 30 秒完美實現 Request 中"攜帶"用戶信息,提高 10 倍性能方案 /api
以前在 大型 fastapi 項目實戰 靠 python 中間件解決方案漲薪了 一文中 詳細的介紹了經過中間件的方式去處理請求中的一些 case,沒有看過的同窗建議看看。微信
1cookie
背景介紹閉包
今天咱們再看一下另一個場景:當請求過來的時候,要對請求統一進行權限驗證。若是驗證經過,那麼就把驗證過的用戶信息附加到 Request 中,這樣在具體的路徑操做裏,就能夠直接使用用戶信息,而不用再次查詢當前用戶。同時還有一個好處是減小了重複代碼量,將之前的在路徑操做部分的權限驗證統一提取出來。今天咱們經過把數據附加到 request.state 中,來解決這個問題。併發
2app
案例實現async
# -*- coding: utf-8 -*-import time@app.middleware("http")async def process_authorization(request: Request, call_next): """ 在這個函數裏統一對訪問作權限 token 校驗。 1.若是是用戶註冊、登錄,那麼不作 token 校驗,由路徑操做函數具體驗證 2.若是是其餘操做,則須要從 header 或者 cookie 中取出 token 信息,解析出內容而後對用戶身份進行驗證, 2.1.若是用戶不存在則直接返回 2.2.若是用戶存在則將用戶信息附加到 request 中,這樣在後續的路徑操做函數中能夠直接使用。 """ start_time = time.time() if request.url.path == '/login' or request.url.path == '/register': # 是登錄或者註冊的路由則直接經過 logger.info('not need jwt verify, please do next task') else: logger.info('need 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
幾點說明:
1.本案例中的方式其實質仍是經過中間件的方式先攔截掉請求再附加信息進行處理,須要看清本質
2.咱們會想一下是否在本身作過的系統中先是把請求放進來 而後在獲取具體與人屬性相關的信息的時候,是否都是先進行查詢人屬性的信息,而後基於此再作接下來的處理,那可否借鑑本案例中的方法進行處理呢?這個問題留給你們進行思考。至於標題中說到的提高 10 倍性能,這個對比基準不一樣測試獲得的效果也有差別,請理性看待
3.若對中間件感興趣的同窗建議結合以前的一篇參照着來學習效果更佳,面試過程當中發現不少同窗一問都用過中間件,但本身沒怎麼自定義過中間件,這是否是值得思考呢?
我堅信:思考問題的方法遠大於具體解決問題的方案,讓咱們繼續一路前行,下期再見!
原創不易,只願能幫助那些須要這些內容的同行或剛入行的小夥伴,你的每次 點贊、分享 都是我繼續創做下去的動力,我但願能在推廣 python 技術的道路上盡我一份力量,歡迎在評論區向我提問,我都會一一解答,記得一鍵三連支持一下哦!
加入python學習交流微信羣,請後臺回覆「入羣」
往期推薦
大型fastapi項目實戰 靠 python 中間件解決方案漲薪了
大型fastapi項目實戰 高併發請求神器之aiohttp(下)
大型fastapi項目實戰 高併發請求神器之aiohttp(上) [建議收藏]
本文分享自微信公衆號 - python編程軍火庫(PythonCoder1024)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。