首頁  >  文章  >  後端開發  >  Python 快速使用 REST API

Python 快速使用 REST API

Guanhui
Guanhui轉載
2020-06-15 18:15:245033瀏覽

Python 快速使用 REST API

##之前先研究一款新的 Python 語言的API,並在一位同事的建議下,我們決定使用 Fastapi 為我們的架構。

Fastapi是一個基於python的框架,該框架鼓勵使用Pydantic和OpenAPI(以前稱為Swagger)進行文件編制,使用Docker進行快速開發和部署以及基於Starlette框架進行的簡單測試。

它提供了許多好處,例如自動OpenAPI驗證和文件編制,而無需添加不必要的膨脹。我認為,在不提供任何內建功能與提供太多內建功能之間取得很好的平衡。

入門

安裝fastapi 和ASGI 伺服器(例如uvicorn):

確保您使用的是Python 3.6.7 如果pippython 給您python 2版本,則可能必須使用pip3python3 。另外,請查看我關於python入門的文章。

pip install fastapi uvicorn
並在

main.py檔案中新增舊的「 hello world」:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def home():
    return {"Hello": "World"}

運行開發##然後運行以進行開發,可以運行

uvicorn main:app --reload

這就是簡單伺服器要做的全部!現在您可以檢查  //localhost:8000/  以查看「主頁」。而且,如您所見,JSON響應“正常工作”!您也可以透過 //localhost:8000/docs 免費取得Swagger UI。

驗證

如前所述,很容易驗證資料(並為接受的資料格式產生Swagger文件)。只需從fastapi新增

Query

匯入,然後使用它來強制驗證:<pre class="brush:php;toolbar:false">from fastapi import FastAPI, Query @app.get('/user') async def user(     *,     user_id: int = Query(..., title=&quot;The ID of the user to get&quot;, gt=0) ):   return { 'user_id': user_id }</pre>第一個參數

...

是預設值,如果使用者不提供值則提供該預設值。如果設定為None,則沒有預設值,且該參數是可選的。為了沒有預設值且該參數是強制性的,請使用Ellipsis ,或...取代。 如果執行此程式碼,則會在swagger UI上自動看到更新:

#Swagger UI可讓您查看新的/ user路由並使用特定的使用者ID進行要求

如果您輸入任何使用者ID,您會看到它會自動為您執行要求,例如 //localhost:8000/user?user_id=1。在頁面中,您只能看到回顯了使用者ID!

如果要改為使用路徑參數(使其為 

/user/1

,則只需輸入並使用Path而不是Query。也可以結合兩者Post 路線

如果您有

POST

路由,則只需定義輸入即可<pre class="brush:php;toolbar:false">@app.post('/user/update') async def update_user(     *,     user_id: int,     really_update: int = Query(...) ):     pass</pre>在這種情況下,您可以看到

user_id

僅被定義為一個沒有QueryPath的整數;這表示它將在POST請求正文中。如果您接受更複雜的資料結構,例如JSON數據,則應研究請求模型。

請求和回應模型

您可以使用Pydantic模型記錄並聲明詳細的請求和回應模型。這不僅可以讓您擁有所有模型的自動OpenAPI文檔,還可以驗證請求模型和響應模型,以確保輸入的任何POST資料都是正確的,並且返回的資料也符合該模型。

只需像這樣聲明模型:

from pydantic import BaseModel

class User(BaseModel):
    id:: int
    name: str
    email: str

然後,如果您希望將使用者模型作為輸入,則可以執行以下操作:

async def update_user(*, user: User):
    pass

或者,如果您要將其用作輸出:

@app.get('/user')
async def user(
    *,
    user_id: int = Query(..., title="The ID of the user to get", gt=0),
    response_model=User
):
  my_user = get_user(user_id)
  return my_user

路由和分解更大的API

您可以使用

APIRouter

將api分解為路由。例如,我已經在我的API 中找到了這個app / routers / v1 / __ init __。py<pre class="brush:php;toolbar:false">from fastapi import APIRouter from .user import router as user_router router = APIRouter() router.include_router(     user_router,     prefix='/user',     tags=['users'], )</pre>然後您可以在

app / routers / v1 / user.py

中使用上面的使用者代碼-只需導入APIRouter並使用@ router.get('/')< aaaa>而不是@ app.get(' / user')。它會自動路由到/ user / ,因為該路由是相對於前綴的。<pre class="brush:php;toolbar:false">from fastapi import APIRouter router = APIRouter() @router.get('/') async def user(     *,     user_id: int = Query(..., title=&quot;The ID of the user to get&quot;, gt=0),     response_model=User ):   my_user = get_user(user_id)   return my_user</pre>最後,要在應用程式中使用所有

v1

路由器,只需將main.py編輯為:<pre class="brush:php;toolbar:false">from fastapi import FastAPI from app.routers import v1 app = FastAPI() app.include_router(     v1.router,     prefix=&quot;/api/v1&quot; )</pre>您可以透過這種方式隨意連結路由器,從而允許您拆分大型應用程式並擁有版本化的API。

Dockerizing and Deploying

Fastapi 的作者使出乎意料的輕鬆之一就是Dockerizing!預設的

Dockerfile

是2行!<pre class="brush:php;toolbar:false">FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7 COPY ./app /app</pre> <p>是否想通过自动重新加载进行 Dockerize 开发?这是我在撰写文件中使用的秘方:</p> <pre class="brush:php;toolbar:false">version: &quot;3&quot; services:   test-api:     build: ..     entrypoint: '/start-reload.sh'     ports:         - 8080:80     volumes:         - ./:/app</pre> <p>这会将当前目录挂载为<code>app并将在任何更改时自动重新加载。您可能还想将app / app用于更大的应用程序。

有用的网址

所有这些信息都来自 Fastapi网站,该文档具有出色的文档,我鼓励您阅读。此外,作者在 Gitter 上非常活跃并乐于助人!

结论

就是这样-我希望本指南对您有所帮助,并且您会像我一样喜欢使用 Fastapi。

推荐教程:Python教程

以上是Python 快速使用 REST API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除