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

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

 

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

在測試環境和生產環境都通過了實際測試,我的認爲能夠實際應用於正式環境了。sql

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

工程目錄結構

├── 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,經過中間件的方式進行統一鑑權。cookie

@app.middleware("http") async def process_authorization(request: Request, call_next): """ 在這個函數裏統一對訪問作權限token校驗。 一、若是是用戶註冊、登錄,那麼不作token校驗,由路徑操做函數具體驗證 二、若是是其餘操做,則須要從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中直接取出用戶基礎信息。app

這樣既方便了權限的統一控制,又減小了代碼重複。框架

相關文章
相關標籤/搜索