溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何用python實(shí)現(xiàn)Request中"攜帶"用戶信息

發(fā)布時(shí)間:2021-06-26 14:50:25 來源:億速云 閱讀:447 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“如何用python實(shí)現(xiàn)Request中"攜帶"用戶信息”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何用python實(shí)現(xiàn)Request中"攜帶"用戶信息”吧!

讀完需要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í)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI