FastAPI 工程管理(四) 工程示例


作者:麥克煎蛋   出處:https://www.cnblogs.com/mazhiyong/ 轉載請保留這段聲明,謝謝!

 

結合前期學習的過程,整理了一份工程實例模板,在基於FastAPI框架的前提下,參考了Flask的一些業務邏輯和文件配置。

在測試環境和生產環境都經過了實際測試,個人認為可以實際應用於正式環境了。

代碼地址: https://github.com/zhiyongma/fastproject

工程目錄結構

├── app
│   ├── auth           # JWT Authorization
│   ├── models         # database models
│   ├── routers        # api routers
│   └── util           # utility
│   ├── __init__.py    # entry file
│   ├── config.py      # project config
│   ├── database.py    # database 
├── deploy             # deploy tools
│   ├── gunicorn_fast.service    # service sample 
│   ├── test_user.sql            # user db sample 
├── gunicorn.py        # gunicorn config
├── local.py           # for development run
├── run.py             # for production run

鑒權核心流程

這里參考了Flask的@app.before_request,通過中間件的方式進行統一鑒權。

    @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

在路徑操作函數中,可以認為已經通過鑒權,並且可以從request.state.user中直接取出用戶基礎信息。

這樣既方便了權限的統一控制,又減少了代碼重復。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM