本篇內(nèi)容主要講解“如何用python實(shí)現(xiàn)Request中"攜帶"用戶信息”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何用python實(shí)現(xiàn)Request中"攜帶"用戶信息”吧!
目前創(chuàng)新互聯(lián)已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、秀洲網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
讀完需要4分鐘
速讀僅需 2 分鐘
/python 30 秒完美實(shí)現(xiàn) Request 中"攜帶"用戶信息,提升 10 倍性能方案 /
之前在 大型 fastapi 項(xiàng)目實(shí)戰(zhàn) 靠 python 中間件解決方案漲薪了 一文中 詳細(xì)的介紹了通過中間件的方式去處理請(qǐng)求中的一些 case,沒有看過的同學(xué)建議看看。
1
背景介紹
今天我們?cè)倏匆幌铝硗庖粋€(gè)場(chǎng)景:當(dāng)請(qǐng)求過來的時(shí)候,要對(duì)請(qǐng)求統(tǒng)一進(jìn)行權(quán)限驗(yàn)證。如果驗(yàn)證通過,那么就把驗(yàn)證過的用戶信息附加到 Request 中,這樣在具體的路徑操作里,就可以直接使用用戶信息,而不用再次查詢當(dāng)前用戶。同時(shí)還有一個(gè)好處是減少了重復(fù)代碼量,將以前的在路徑操作部分的權(quán)限驗(yàn)證統(tǒng)一提取出來。今天我們通過把數(shù)據(jù)附加到 request.state 中,來解決這個(gè)問題。
2
案例實(shí)現(xiàn)
# -*- coding: utf-8 -*-import time@app.middleware("http")async def process_authorization(request: Request, call_next): """ 在這個(gè)函數(shù)里統(tǒng)一對(duì)訪問做權(quán)限 token 校驗(yàn)。 1.如果是用戶注冊(cè)、登陸,那么不做 token 校驗(yàn),由路徑操作函數(shù)具體驗(yàn)證 2.如果是其他操作,則需要從 header 或者 cookie 中取出 token 信息,解析出內(nèi)容然后對(duì)用戶身份進(jìn)行驗(yàn)證, 2.1.如果用戶不存在則直接返回 2.2.如果用戶存在則將用戶信息附加到 request 中,這樣在后續(xù)的路徑操作函數(shù)中可以直接使用。 """ start_time = time.time() if request.url.path == '/login' or request.url.path == '/register': # 是登陸或者注冊(cè)的路由則直接通過 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) # 進(jìn)行接下來的操作處理 response = await call_next(request) process_time = time.time() - start_time response.headers["X-Process-Time"] = str(process_time) return response
幾點(diǎn)說明:
1.本案例中的方式其實(shí)質(zhì)還是通過中間件的方式先攔截掉請(qǐng)求再附加信息進(jìn)行處理,需要看清本質(zhì)
2.我們會(huì)想一下是否在自己做過的系統(tǒng)中先是把請(qǐng)求放進(jìn)來 然后在獲取具體與人屬性相關(guān)的信息的時(shí)候,是否都是先進(jìn)行查詢?nèi)藢傩缘男畔ⅲ缓蠡诖嗽僮鼋酉聛淼奶幚?,那能否借鑒本案例中的方法進(jìn)行處理呢?這個(gè)問題留給大家進(jìn)行思考。至于標(biāo)題中說到的提升 10 倍性能,這個(gè)對(duì)比基準(zhǔn)不同測(cè)試得到的效果也有差異,請(qǐng)理性看待
3.若對(duì)中間件感興趣的同學(xué)建議結(jié)合之前的一篇參照著來學(xué)習(xí)效果更佳,面試過程中發(fā)現(xiàn)很多同學(xué)一問都用過中間件,但自己沒怎么自定義過中間件,這是不是值得思考呢?
到此,相信大家對(duì)“如何用python實(shí)現(xiàn)Request中"攜帶"用戶信息”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!