創新實訓2024.05.25日志:Web應用技術選型

我們的web應用使用python web的fastapi框架,通過uvicorn開啟web服務。

1. refs

官網文檔:FastAPI (tiangolo.com)

github:https://github.com/tiangolo/fastapi

2. 環境配置

python:3.11+

uvicorn:0.29.0

pip install "uvicorn[standard]"

什么是uvicorn?

Uvicorn 是一個輕量級的 ASGI(Asynchronous Server Gateway Interface)服務器,用于運行 Python 的 ASGI 應用。ASGI 是一個標準接口,用于異步Web應用程序和服務器之間的通信,它允許你編寫異步代碼,從而提高應用程序的性能和可伸縮性。

Uvicorn 的主要特點包括:

  1. 異步支持:Uvicorn 完全支持異步,這意味著它可以處理大量的并發連接,而不會阻塞服務器。
  2. 性能:Uvicorn 提供了高性能的服務器能力,特別是在與異步框架(如 FastAPI 或 Starlette)結合使用時。
  3. 簡單易用:Uvicorn 的使用非常簡單,可以通過命令行啟動,也可以作為庫在代碼中啟動。
  4. 跨平臺:Uvicorn 可以在多種操作系統上運行,包括 Windows、macOS 和 Linux。
  5. 可擴展性:Uvicorn 可以輕松擴展以適應不同的工作負載,適用于從小規模到大規模的生產環境。
  6. 內置支持:許多現代 Python Web 框架,如 FastAPI 和 Starlette,已經內置了對 Uvicorn 的支持。
  7. 命令行接口:Uvicorn 提供了一個命令行接口(CLI),允許你快速啟動和管理 ASGI 應用。
  8. WebSockets 支持:Uvicorn 支持 WebSockets,使得實時通信和交互式應用的構建成為可能。
  9. Gunicorn 集成:Uvicorn 可以與 Gunicorn(一個 Python WSGI HTTP 服務器)集成,通過 Gunicorn 運行 Uvicorn 工作器。

FastAPI的官網介紹自己說是性能最好的Python Web框架之一,主要原因就是web端的UvicornStarlette的功勞。

fastapi:0.111.0

pip install fastapi

可以看到fastapi是依賴于uvicorn做服務器的,所以務必下載這個依賴。

3. Start Off

3.1. 一個最簡單的例子

啟動服務

先來一個最簡單的示例:

# file:main.py
from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():return {"message": "Hello World"}@app.get("/hello/{name}")
async def say_hello(name: str):return {"message": f"Hello {name}"}

隨后利用命令:

uvicorn main:app --reload

進行啟動

uvicorn main:app?命令含義如下:

  • mainmain.py?文件(一個 Python「模塊」)。
  • app:在?main.py?文件中通過?app = FastAPI()?創建的對象。
  • -reload:讓服務器在更新代碼后重新啟動。僅在開發時使用該選項。

隨后可以請求下我們創建的兩個接口:

可以看到服務端的所有請求:

同時,可以創建一個.http文件,進行接口測試:

接口文檔

跳轉到?http://127.0.0.1:8000/docs。

你將會看到自動生成的交互式 API 文檔(由?Swagger UI?提供)

以及由?ReDoc提供的可選的文檔

OpenAPI規范

FastAPI?使用定義 API 的?OpenAPI?標準將你的所有 API 轉換成一種模式描述,或者說是API的規范。

訪問127.0.0.1:8000/openapi.json可以看到這個json文檔。

3.2. 開放一個新的接口

路徑類型

這個在上面的實例中已經有所體現:

@app.get("/")
async def root():return {"message": "Hello World"}

這里的請求路徑方式有很多,包括:

@app.post()
@app.put()
@app.delete()
@app.options()
@app.head()
@app.patch()
@app.trace()

雖然在語義上有所不同,但前三個(post,put,delete)的實際行為是可以任意規定的。比如本來該delete的行為,用post來傳遞參數,其實也無所謂。

另外我們可以用async關鍵字來規定某個接口的行為是否是異步的,對于那些不需要等待其他子程序的請求,我們可以允許這樣的異步行為,利用await關鍵字告知python在這段程序執行時你可以轉而執行其他子程序,等到這段程序執行完畢再返回執行。

路徑參數

參數聲明+參數類型

@app.get("/items/{item_id}")
async def read_item(item_id: int):return {"item_id": item_id}

本例把?item_id?的類型聲明為?int

同時會對這個參數進行校驗,如果你傳個沒法轉成int類型的數據,(比如food,4.2這種)將報錯:

{"detail": [{"loc": ["path","item_id"],"msg": "value is not a valid integer","type": "type_error.integer"}]
}

此外,這個類型可以是枚舉類型:路徑操作使用 Python 的?Enum?類型接收預設的路徑參數

導入?Enum?并創建繼承自?str?和?Enum?的子類。

通過從?str?繼承,API 文檔就能把值的類型定義為字符串,并且能正確渲染。

然后,創建包含固定值的類屬性,這些固定值是可用的有效值:

from enum import Enumfrom fastapi import FastAPIclass ModelName(str, Enum):alexnet = "alexnet"resnet = "resnet"lenet = "lenet"app = FastAPI()@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):if model_name is ModelName.alexnet:return {"model_name": model_name, "message": "Deep Learning FTW!"}if model_name.value == "lenet":return {"model_name": model_name, "message": "LeCNN all the images"}return {"model_name": model_name, "message": "Have some residuals"}

最后,這個參數本身可能也是個路徑,例如/home/myfile.txt這種,此時要用到路徑轉換器:

from fastapi import FastAPIapp = FastAPI()@app.get("/files/{file_path:path}")
async def read_file(file_path: str):return {"file_path": file_path}

本例中,參數名為?file_path,結尾部分的?:path?說明該參數應匹配路徑

查詢參數

在?后,用&分割

例如:

from fastapi import FastAPIapp = FastAPI()fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):return fake_items_db[skip : skip + limit]

利用該接口請求:

<http://127.0.0.1:8000/items/?skip=0&limit=10>

如果不指定這兩個參數,那么將是默認值

請求體

這里有一個很關鍵的組件,叫做pydantic,是python生態圈里很有名的做數據校驗的組件:Welcome to Pydantic - Pydantic

首先我們需要利用pydantic提供的basemodel來定義一個合法的請求體是什么樣子的:

from fastapi import FastAPI
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Noneapp = FastAPI()@app.post("/items/")
async def create_item(item: Item):return item

其中description和tax是有默認值的,可以不給他們傳參,但是沒有默認值得必須傳參了。

from fastapi import FastAPI
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Noneapp = FastAPI()@app.post("/items/")
async def create_item(item: Item):return item

此處,請求體參數的類型為?Item?模型。 甚至請求體和路徑參數是可以共存的:

from fastapi import FastAPI
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Noneapp = FastAPI()@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):return {"item_id": item_id, **item.dict()}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16017.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16017.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16017.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

老外賣27刀每月的教程已經更新

用了兩天半的時間&#xff0c;邊學習&#xff0c;邊整理了一份老外的視頻教程&#xff0c;涉及Facebook&#xff0c;YouTube&#xff0c;tiktok等大的流量平臺&#xff0c;有案例&#xff0c;有分析&#xff0c;有如何做。 這個教程是老外講的&#xff0c;沒有什么玄乎的塑造價…

理解矩陣內積與矩陣乘法的區別及其應用

文章目錄 矩陣內積&#xff08;逐元素乘積&#xff09;矩陣內積的用途矩陣乘法&#xff08;矩陣積&#xff09;矩陣乘法的用途區別總結結論 在數據科學、機器學習、計算機圖形學和圖像處理等領域&#xff0c;矩陣運算是非常基礎且重要的操作。然而&#xff0c;矩陣內積和矩陣乘…

【java程序設計期末復習】chapter3 運算符、表達式和語句

運算符、表達式和語句 Java提供了豐富的運算符&#xff0c;如算術運算符、關系運算符、邏輯運算符、位運算符等。 Java語言中的絕大多數運算符和C語言相同&#xff0c;基本語句&#xff0c;如條件分支語句、循環語句等也和C語言類似&#xff0c;因此&#xff0c;本章就主要知識…

聊聊ChatGPT的本質

這是鼎叔的第九十八篇原創文章。行業大牛和剛畢業的小白&#xff0c;都可以進來聊聊。 階段性總結下我對ChatGPT的基礎理解&#xff0c;算是一篇學習思考筆記吧。其中難免有很多不準確的&#xff0c;或過于簡略的地方&#xff0c;將來再迭代學習。 OpenAI做ChatGPT的底層邏輯…

GitLab的原理及應用詳解(六)

本系列文章簡介&#xff1a; 隨著軟件開發的不斷進步和發展&#xff0c;版本控制系統成為了現代軟件開發過程中不可或缺的一部分。而GitLab作為其中一種流行的版本控制工具&#xff0c;在軟件開發領域享有廣泛的應用。GitLab不僅提供了強大的版本控制功能&#xff0c;還集成了項…

如何利用線程池實現互聯網驗證碼保護服務

如何利用線程池實現互聯網驗證碼保護服務 1、業務背景與實現思路2、代碼實操1、業務背景與實現思路 首先介紹一下業務背景,假設我們的系統是一個短視頻播放網站,每個新加入的用戶都需要注冊賬號并綁定手機號。為了驗證用戶手機的正確性,我們的系統會發送一條驗證碼到用戶注…

HBase到底是列式存儲還是行式存儲?

行存和列存 在行存儲的數據庫系統中&#xff0c;一行中的所有字段值都是連續存儲的&#xff1b;在基于行存儲的表中&#xff0c;即使只需要讀取指定列時&#xff0c;也需要先將對應行的數據讀取到內存&#xff0c;再過濾目標列&#xff0c;這樣會導致過多的磁盤IO、內存和時間…

隊列——鏈式存儲

核心思路&#xff1a; 1、首先定義隊列結點&#xff0c;包含數據域和指針域&#xff1b;然后定義鏈式隊列&#xff0c;包含隊列節點類型的隊頭和隊尾指針。 2、初始化&#xff1a;     帶頭結點&#xff1a;給頭結點分配內存&#xff0c;然后隊頭和隊尾指針指向頭結點&…

每日一題 字符串排序

目錄 1.前言 2.題目解析 3.算法原理 4.代碼實現 1.前言 在編程練習中&#xff0c;字符串的全排列問題是一個經典的算法問題。通過對字符串進行全排列&#xff0c;可以得到該字符串的所有可能的排列組合。本文將探討如何對含有重復字符的字符串進行全排列&#xff0c;并且解決…

K8s的kubectl的基本操作

K8s的kubectl的基本操作 K8s基本信息的查看 查看版本信息 kubectl versio查看資源對象簡寫 kubectl api-resources查看集群信息 kubectl cluster-info配置kubectl自動補全 source <(kubectl completion bash)查看master節點狀態 kubectl get cs查看命名空間 kubectl…

10.js預解析

就是在代碼執行之前&#xff0c;對代碼進行通讀解釋 只解析兩個內容&#xff1a; &#xff08;1&#xff09;對var聲明的變量 &#xff08;2&#xff09;聲明式函數 &#xff08;1&#xff09;對var聲明的變量進行提前聲明&#xff0c;但不賦值 var x console.log(x) //undefi…

【找出第 K 大的異或坐標值】python

4層循環暴力超時 class Solution:def kthLargestValue(self, matrix: List[List[int]], k: int) -> int:nums[]for a in range(len(matrix)):for b in range(len(matrix[0])):num0for i in range(a1):for j in range(b1):num^matrix[i][j]nums.append(num)nums.sort()retu…

web安全滲透測試十大常規項(一):web滲透測試之CSRF跨站請求偽造

滲透測試之CSRF跨站請求偽造 CSRF跨站請求偽造 CSRF跨站請求偽造

類的內存對齊位段位圖布隆過濾器哈希切割一致性哈希

文章目錄 一、類的內存對齊1.1規則1.2原因 二、位段2.1介紹2.2內存分配問題2.3跨平臺問題2.4使用的注意事項 三、位圖的應用3.1 給40億個不重復的無符號整數&#xff0c;找給定的一個數。&#xff08;int的范圍可以到達42億多&#xff09;3.2 給定100億個整數&#xff0c;設計算…

Golang實現文件復制

方法&#xff1a;三種 package zdpgo_fileimport ("errors""io""os" )// CopyFile 使用io.Copy進行文件的復制&#xff0c;同時也會復制文件的所有權限 // param src 復制文件 // param des 目標文件 // return error 錯誤信息 func CopyFile(s…

2024年弘連網絡FIC大會競賽題線下決賽題

總結&#xff1a; FIC決賽的時候&#xff0c;很多小問題沒發現&#xff0c;在pve平臺做題確實很方便。 這套題目復盤完&#xff0c;服務器這塊的知識確實收獲了很多&#xff0c;對pve集群平臺和網絡拓撲也有了一定的認識&#xff0c;感謝各位大佬悉心指導。 接下來&#xff0…

【FPGA】Verilog:奇校驗位生成器的實現(Odd Parity bit generator)

解釋奇數奇偶校驗位生成器和檢查器的仿真結果及過程。 真值表和卡洛圖: Odd Parity Bit Generator A B C

怎么在pyqt中顯示matplotlib的繪圖?

想要在pyqt中顯示matplotlib的繪圖&#xff0c;在繪圖時&#xff0c;其實不必使用以下語句&#xff1a; matplotlib.use("Qt5Agg") # 聲明使用QT5最關鍵的語句是&#xff1a; from matplotlib.backends.backend_qt5agg import FigureCanvasQTAggFigureCanvasQTAgg…

學 Python 具體能干什么?

Python 是一種功能強大、用途廣泛的編程語言&#xff0c;因其簡潔易讀的語法和豐富的庫生態系統而備受歡迎。學習 Python后&#xff0c;你可以從事以下幾方面的工作&#xff1a; 1. Web 開發 Python 有很多流行的 Web 框架&#xff0c;如&#xff1a; Django&#xff1a;一個…

Android studio的Gradle出問題

Gradle sync failed: Plugin [id: com.android.application, version: 7.1.1, apply: false] was not found in any of the following sources: 在src里面的build.gradle中 plugins { id ‘com.android.application’ } 的上面加上 buildscript {repositories {jcenter()}depen…