您好,登錄后才能下訂單哦!
本篇內容主要講解“如何用python實現Request中"攜帶"用戶信息”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何用python實現Request中"攜帶"用戶信息”吧!
讀完需要4分鐘
速讀僅需 2 分鐘
/ python 30 秒完美實現 Request 中"攜帶"用戶信息,提升 10 倍性能方案 /
之前在 大型 fastapi 項目實戰 靠 python 中間件解決方案漲薪了 一文中 詳細的介紹了通過中間件的方式去處理請求中的一些 case,沒有看過的同學建議看看。
1
背景介紹
今天我們再看一下另外一個場景:當請求過來的時候,要對請求統一進行權限驗證。如果驗證通過,那么就把驗證過的用戶信息附加到 Request 中,這樣在具體的路徑操作里,就可以直接使用用戶信息,而不用再次查詢當前用戶。同時還有一個好處是減少了重復代碼量,將以前的在路徑操作部分的權限驗證統一提取出來。今天我們通過把數據附加到 request.state 中,來解決這個問題。
2
案例實現
# -*- 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實現Request中"攜帶"用戶信息”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。