1. 程式人生 > 實用技巧 >FastAPI 工程管理(四) 工程示例

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中直接取出使用者基礎資訊。

這樣既方便了許可權的統一控制,又減少了程式碼重複。