自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

FastAPI 大型項(xiàng)目模板框架

開發(fā) 架構(gòu)
官方提供了一個(gè)項(xiàng)目框架模板,但是由于 FastAPI 自由度比較高,所以大家可以根據(jù)自己的習(xí)慣去實(shí)現(xiàn)一個(gè)項(xiàng)目框架,我就根據(jù)自己使用 Django 的習(xí)慣實(shí)現(xiàn)了一個(gè)我認(rèn)為比較合適的框架結(jié)構(gòu)。

[[398990]]

 FastAPI 是一個(gè)用于構(gòu)建 API 的現(xiàn)代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于標(biāo)準(zhǔn)的 Python 類型提示。

關(guān)鍵特性:

  • 快速:可與 NodeJS 和 Go 比肩的極高性能(歸功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
  • 高效編碼:提高功能開發(fā)速度約 200% 至 300%。
  • 更少 bug:減少約 40% 的人為(開發(fā)者)導(dǎo)致錯(cuò)誤。
  • 智能:極佳的編輯器支持。處處皆可自動(dòng)補(bǔ)全,減少調(diào)試時(shí)間。
  • 簡(jiǎn)單:設(shè)計(jì)的易于使用和學(xué)習(xí),閱讀文檔的時(shí)間更短。
  • 簡(jiǎn)短:使代碼重復(fù)最小化。通過不同的參數(shù)聲明實(shí)現(xiàn)豐富的功能。bug 更少。
  • 健壯:生產(chǎn)可用級(jí)別的代碼。還有自動(dòng)生成的交互式文檔。
  • 標(biāo)準(zhǔn)化:基于(并完全兼容)API 的相關(guān)開放標(biāo)準(zhǔn):OpenAPI (以前被稱為 Swagger) 和 JSON Schema。

以上這段是 FastAPI 官方文檔的介紹,通過我自己的使用,發(fā)現(xiàn)雖然效率提升沒有官方說得那么高,但是確實(shí)會(huì)快很多,而且我認(rèn)為這個(gè)框架的代碼書寫更 pythonic 一點(diǎn),如果用習(xí)慣了,在寫別的 Python 代碼時(shí),也更加規(guī)范一些。

熟悉 Flask 的人上手 FastAPI 可能會(huì)比較快一些,一個(gè) py 腳本就能搭起來一個(gè)網(wǎng)站,但是我們開發(fā)項(xiàng)目的時(shí)候,肯定不會(huì)把所有邏輯都塞在一個(gè)腳本里面,因此就需要提供一個(gè)像 Django 那樣的完整項(xiàng)目框架,業(yè)務(wù)開發(fā)只要按照固定的規(guī)則添加就行了。雖然官方提供了一個(gè)項(xiàng)目框架模板,但是由于 FastAPI 自由度比較高,所以大家可以根據(jù)自己的習(xí)慣去實(shí)現(xiàn)一個(gè)項(xiàng)目框架,我就根據(jù)自己使用 Django 的習(xí)慣實(shí)現(xiàn)了一個(gè)我認(rèn)為比較合適的框架結(jié)構(gòu)。下面就是大概的介紹。

簡(jiǎn)介

使用FastAPI + MySql + Tortoise-orm 作為主要數(shù)據(jù)庫(kù)操作,項(xiàng)目結(jié)構(gòu)參考GitHub上兩個(gè)項(xiàng)目:

  • CoderCharm / fastapi-mysql-generator
  • FastAPI-demo

功能

  • JWT token 認(rèn)證。
  • 使用 Tortoise-orm models(MySql).
  • 基于 casbin 的權(quán)限驗(yàn)證
  • loguru 日志模塊使用

權(quán)限控制

  • 登錄、注冊(cè)及路由中含有openapi的接口不進(jìn)行登錄和權(quán)限認(rèn)證
  1. async def jwt_authentication( 
  2.         request: Request, 
  3.         x_token: str = Header( 
  4.             None, 
  5.             title='登錄Token'
  6.             description='登錄、注冊(cè)及開放API不需要此參數(shù)' 
  7.         ) 
  8. ): 
  9.     ""
  10.             除了開放API、登錄、注冊(cè)以外,其他均需要認(rèn)證 
  11.             :param request: 
  12.             :return
  13.             ""
  14.     if 'openapi' in request.url.path.lower() or \ 
  15.             'login' in request.url.path.lower() or \ 
  16.             'register' in request.url.path.lower(): 
  17.         return None 
  18.     .... 

 全局登錄認(rèn)證(除以上接口外,其余接口均進(jìn)行登錄認(rèn)證)

  1. app = FastAPI( 
  2.         debug=settings.DEBUG, 
  3.         title=settings.TITLE, 
  4.         description=settings.DESCRIPTION, 
  5.         docs_url=settings.DOCS_URL, 
  6.         redoc_url=settings.REDOC_URL, 
  7.         dependencies=[Depends(jwt_authentication)] 
  8.     ) 

 全局進(jìn)行 Depends(jwt_authentication) 依賴注入

  • 接口權(quán)限認(rèn)證

首先通過 auth/add 和 auth/del 接口進(jìn)行權(quán)限配置

  1. @router.get( 
  2.     "/info"
  3.     summary="獲取當(dāng)前用戶信息"
  4.     name="獲取當(dāng)前用戶信息"
  5.     response_model=schema.UserOut, 
  6.     response_model_exclude_unset=True
  7.     dependencies=[Depends(Authority('user,check'))] 

 在接口上添加 Depends(Authority('user,check')) 依賴注入來判斷權(quán)限

  • 操作權(quán)限認(rèn)證

在接口中進(jìn)行特殊權(quán)限認(rèn)證,只要使用check_authority函數(shù)判斷即可,如果無權(quán)限會(huì)拋出異常

  1. await check_authority(f'{request.state.user.username},auth,add'

配置

配置文件:

core/config/development_config.py 和 production_config.py

修改 API 文檔默認(rèn)地址

為了通過權(quán)限認(rèn)證,將 API 文檔地址修改為包含 openapi 的 URL

  1. # 文檔地址 默認(rèn)為docs 
  2. DOCS_URL: str = "/openapi/docs" 
  3. # 文檔關(guān)聯(lián)請(qǐng)求數(shù)據(jù)接口 
  4. OPENAPI_URL: str = "/openapi/openapi.json" 
  5. # redoc 文檔 
  6. REDOC_URL: Optional[str] = "/openapi/redoc" 
  •  超級(jí)管理員

設(shè)置用戶角色為 super 的用戶為超級(jí)管理員

  1. SUPER_USER: str = 'super' 

配置數(shù)據(jù)庫(kù)

  1. # 數(shù)據(jù)庫(kù)配置 
  2. DATABASE_CONFIG: dict = { 
  3.     'connections': { 
  4.         # Dict format for connection 
  5.         'default''mysql://root:123456@127.0.0.1:3306/testdb' 
  6.     }, 
  7.     'apps': { 
  8.         'models': { 
  9.             # 設(shè)置key值“default”的數(shù)據(jù)庫(kù)連接 
  10.             'default_connection''default'
  11.             'models': [ 
  12.                 'apps.user.model'
  13.                 'auth.casbin_tortoise_adapter' 
  14.             ] 
  15.         } 
  16.     } 

 數(shù)據(jù)庫(kù)使用 Tortoise-orm 庫(kù),因?yàn)槲乙恢痹谑褂?Django,Django 自有一套 ORM 模型操作,用起來比較方便也比較熟悉,很多人使用 sqlalchemy,我覺得這個(gè)不方便,而 Tortoise-orm 是借鑒了 Django ORM 來實(shí)現(xiàn)的異步數(shù)據(jù)庫(kù)操作庫(kù),對(duì)于使用了 Django 的人來講比較友好

運(yùn)行

  1. # 進(jìn)入項(xiàng)目目錄 
  2. pipenv install 
  3.  
  4. # 進(jìn)入虛擬環(huán)境 
  5. pipenv shell 
  6.  
  7. # 運(yùn)行服務(wù)器 
  8. python run.py 

 【編輯推薦】

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2015-08-26 10:36:32

ios開發(fā)漫談

2015-08-31 10:11:43

iOS大項(xiàng)目開發(fā)

2022-03-14 10:24:31

編程語言開發(fā)

2021-01-13 09:34:45

項(xiàng)目Gson框架

2024-01-22 09:17:35

2024-12-26 08:00:38

2012-04-01 15:03:39

大型項(xiàng)目開發(fā)者

2021-01-26 05:39:06

項(xiàng)目模塊代碼

2012-09-23 09:38:13

鐵路客票系統(tǒng)

2019-10-10 10:30:26

MVCModelController

2020-09-15 06:13:05

Vue.jsJavaScript框架

2019-12-16 11:16:22

Git子模塊項(xiàng)目

2024-02-21 09:32:18

開發(fā)架構(gòu)

2018-01-09 22:18:18

架構(gòu)阿里巴巴服務(wù)器

2020-08-30 14:32:57

Vue.jsJavaScript前端

2024-12-16 00:50:56

2024-01-02 10:28:52

FastapiOpenAPI接口

2023-08-02 10:39:18

代碼React版window

2023-10-09 18:17:52

Python語言Web

2024-01-02 08:22:01

Koin框架項(xiàng)目
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)