日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flask get 参数_用它 5 分钟以后,我放弃用了四年的 Flask

發布時間:2024/7/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flask get 参数_用它 5 分钟以后,我放弃用了四年的 Flask 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀本文大概需要 3 分鐘。

有一個非常簡單的需求:編寫一個 HTTP 接口,使用 POST 方式發送一個 JSON 字符串,接口里面讀取發送上來的參數,對其中某個參數進行處理,并返回。

如果我們使用 Flask 來開發這個接口,那么代碼是這樣的:

from?flask?import?Flask,?request

app?=?Flask(__name__)


@app.route('/insert',?methods=['POST'])
def?insert():
????info?=?request.json
????name?=?info['name']
????age?=?info['age']
????age_after_10_years?=?age?+?10
????msg?=?f'此人名叫:{name},10年后,此人年齡:{age_after_10_years}'
????return?{'success':?True,?'msg':?msg}

代碼看起來已經很簡潔了。我們用requests發個請求看看效果,如下圖所示:

看起來沒什么問題。

現在,我搞點破壞,把age字段改成字符串,再運行一下:

不出所料,報錯了。

現在我們把age字段改回數字,但是直接移除name字段:

又報錯了。

為了防止用戶不按規矩提交數據,我們必須在接口里面做好各種異常數據的判斷。于是增加判斷以后的代碼變得復雜了:

@app.route('/insert',?methods=['POST'])
def?insert():
????info?=?request.json
????name?=?info.get('name',?'')
????ifnot?name:
????????return?{'success':?False,?'msg':?'name 參數不可省略,不可為空!'}
????age?=?info.get('age',?0)
????ifnot?isinstance(age,?int):
????????return?{'success':?False,?'msg':?'age參數不是數字!'}
????age_after_10_years?=?age?+?10
????msg?=?f'此人名叫:{name},10年后,此人年齡:{age_after_10_years}'
????return?{'success':?True,?'msg':?msg}

看來,用 Flask,雖然能讓你用很短的代碼寫出一個能工作的項目。但要寫成一個可以正常使用的項目,還是需要你自己寫更多代碼。

下面我們來看一下,現代化的 web 框架:FastApi能把這個工程簡化到什么程度:

from?fastapi?import?FastAPI
from?pydantic?import?BaseModel

app?=?FastAPI()


class?People(BaseModel):
????name:?str
????age:?int
????address:?str
????salary:?float

@app.post('/insert')
def?insert(people:?People):
????age_after_10_years?=?people.age?+?10
????msg?=?f'此人名字叫做:{people.name},十年后此人年齡:{age_after_10_years}'
????return?{'success':?True,?'msg':?msg}

我們還是使用 requests 發一條信息給 FastApi 開發的 HTTP 接口。對于正常數據,正常使用:

現在我們把age字段改成字符串:

返回友好的提示信息,告訴我類型錯誤:age 字段不是 integer。

我們再試一試把name字段去掉:

返回友好信息,提示值錯誤:name字段丟失。

整個過程中,對類型的檢查全都由 FastApi 自己完成。我們省下來很多時間。

我用了 Flask 四年,但在使用了 5 分鐘 FastApi 以后,我決定以后不再使用 Flask 了。

回過頭來,我們好好介紹一下 FastApi。

使用pip或者pipenv即可安裝 FastApi:

pip?install?fastapi
pipenv?install?fastapi

安裝完成以后,我們來完成第一個 API:

from?fastapi?import?FastAPI

app?=?FastAPI()


@app.get('/')
def?index():
????return?{'message':?'你已經正確創建 FastApi 服務!'}

這里的寫法跟 Flask 幾乎一致。只不過在 Flask 中,我們定義路由的裝飾器為@app.route('/')。而這里寫為@app.get('/')

寫好代碼以后,我們需要使用uvicorn來運行 FastApi。首先使用pip或者pipenv安裝uvicorn:

pip?install?uvicorn
pipenv?install?uvicorn

然后執行命令:

uvicorn?main:app?--reload

其中main表示我們的代碼文件為main.py,app表示我們初始化的 FastApi 對象的名字。--reload參數表示在修改了代碼以后立即生效,不需要重啟。

運行命令以后,我們訪問http://127.0.0.1:8000可以看到接口已經正確返回了 JSON 格式的數據:

那么如何定義一個帶參數的 GET 方法呢?我們再寫一段代碼:

@app.get('/query/{uid}')
def?query(uid):
????msg?=?f'你查詢的 uid 為:{uid}'
????return?{'success':?True,?'msg':?msg}

寫好代碼以后,我們直接在瀏覽器里面訪問新的地址,可以看到修改已經生效了,如下圖所示:

如果想限定 uid 只能是數字,不能是字符串怎么辦呢?你只需要多加 4 個字符:

@app.get('/query/{uid}')
def?query(uid:?int):
????msg?=?f'你查詢的 uid 為:{uid}'
????return?{'success':?True,?'msg':?msg}

對函數query的參數使用類型標注,標注為 int 類型。現在我們再來訪問一下接口:

當 query 后面的參數不是整數時,正常報錯了。

我們再來看一下本文一開始的 POST 方法。在使用 Flask 的時候,我們需要手動驗證用戶 POST 提交上來的數據是什么格式的,字段對不對。

但使用 FastApi 的時候,我們只需要類型標注就能解決所有問題。首先我們導入from pydantic import BaseModel,然后繼承BaseModel實現我們允許 POST 方法提交上來的數據字段和格式:

from?pydantic?import?BaseModel

app?=?FastAPI()


class?People(BaseModel):
????name:?str
????age:?int
????address:?str
????salary:?float

People這個類通過類型標注,指定了它里面的 4 個字段和他們的類型。現在,我們來實現 POST 方法:

@app.post('/insert')
def?insert(people:?People):
????age_after_10_years?=?people.age?+?10
????msg?=?f'此人名字叫做:{people.name},十年后此人年齡:{age_after_10_years}'
????return?{'success':?True,?'msg':?msg}

insert函數的參數people通過類型標注指定為People類型。

當我們使用 POST 方式提交數據時,FastApi 自動會以People中定義的字段為基準來校驗數據,發現不對就返回報錯信息。

除了開發接口變得非常簡單外,FastApi 還會自動幫我們生成接口文檔。大家訪問http://127.0.0.1:8000/docs,可以看到接口文檔已經自動生成好了:

這個接口不僅能看,而且直接就能在接口頁面修改樣例數據,發送請求,現場測試:

以上是對 FastApi 的極簡介紹。有興趣的同學可以查閱它的官方文檔。

最后,告訴大家,FastApi 是一個異步 Web 框架,它的速度非常非常非常快。遠遠超過 Flask。

FastApi 是最快的幾個 Web 框架之一。速度可以匹敵 Golang 寫的接口。詳細的對比可以看:https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7

推薦閱讀

1

精品連載丨安卓 App 逆向課程一之環境配置

2

GitHub 熱榜:一款居家旅行必備的看片神器!

3

教你輕松截獲 Selenium 中的 Ajax 數據

4??

如何用一條命令將網頁轉成電腦 App

好文和朋友一起看~

總結

以上是生活随笔為你收集整理的flask get 参数_用它 5 分钟以后,我放弃用了四年的 Flask的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。