python 快速构建 rest api :fastapi 框架简介 | python优质外文翻译 | python 技术论坛-江南app体育官方入口

最近一直在研究一个新的 python 语言的api,在一位同事的建议下,我们决定使用 作为我们的框架。

fastapi是一个基于python的框架,该框架鼓励使用pydantic和openapi(以前称为swagger)进行文档编制,使用docker进行快速开发和部署以及基于starlette框架进行的简单测试。

它提供了许多好处,例如自动openapi验证和文档编制,而无需添加不必要的膨胀。我认为,在不提供任何内置功能与提供太多内置功能之间取得很好的平衡。

入门

安装 fastapi 和 asgi 服务器(例如uvicorn):

确保您使用的是python 3.6.7 如果 pippython 给您python 2版本,则可能必须使用 pip3python3 。另外,。

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

这就是简单服务器要做的全部!现在您可以检查   以查看“江南app体育官方入口主页”。而且,如您所见,json响应“正常工作”!您还可以通过 免费获得swagger ui。

验证

如前所述,很容易验证数据(并为接受的数据格式生成swagger文档)。只需从fastapi添加query导入,然后使用它来强制验证:

from fastapi import fastapi, query
@app.get('/user')
async def user(
    *,
    user_id: int = query(..., title="the id of the user to get", gt=0)
):
  return { 'user_id': user_id }

第一个参数...是默认值,如果用户不提供值则提供该默认值。如果设置为none,则没有默认值,并且该参数是可选的。为了没有默认值并且该参数是强制性的,请使用 ,或...代替。

如果运行此代码,则会在swagger ui上自动看到更新:

swagger ui允许您查看新的/ user路由并使用特定的用户id进行请求

如果您输入任何用户id,您会看到它会自动为您执行请求,例如  。在页面中,您只能看到回显了用户id!

如果要改为使用路径参数(以使其为 /user/1,则只需输入并使用path而不是query。也可以结合两者

post 路线

如果您有post路由,则只需定义输入即可

@app.post('/user/update')
async def update_user(
    *,
    user_id: int,
    really_update: int = query(...)
):
    pass

在这种情况下,您可以看到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

from fastapi import apirouter
from .user import router as user_router
router = apirouter()
router.include_router(
    user_router,
    prefix='/user',
    tags=['users'],
)

然后您可以在app / routers / v1 / user.py中使用上面的用户代码-只需导入apirouter并使用@ router.get('/')< aaaa>而不是 @ app.get('/ user')。它会自动路由到 / user / ,因为该路由是相对于前缀的。

from fastapi import apirouter
router = apirouter()
@router.get('/')
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

最后,要在应用程序中使用所有v1路由器,只需将main.py编辑为:

from fastapi import fastapi
from app.routers import v1
app = fastapi()
app.include_router(
    v1.router,
    prefix="/api/v1"
)

您可以通过这种方式随意链接路由器,从而允许您拆分大型应用程序并拥有版本化的api。

dockerizing and deploying

fastapi 的作者使出乎意料的轻松之一就是 dockerizing!默认的dockerfile是2行!

from tiangolo/uvicorn-gunicorn-fastapi:python3.7
copy ./app /app

是否想通过自动重新加载进行 dockerize 开发?这是我在撰写文件中使用的秘方:

version: "3"
services:
  test-api:
    build: ..
    entrypoint: '/start-reload.sh'
    ports:
        - 8080:80
    volumes:
        - ./:/app

这会将当前目录挂载为app并将在任何更改时自动重新加载。您可能还想将app / app用于更大的应用程序。

有用的网址

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

结论

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

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 cc 协议,如果我们的工作有侵犯到您的权益,请及时联系江南app体育官方入口。

原文地址:

译文地址:https://learnku.com/python/t/38942

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 1

安装失败了
could not fetch url https://pypi.org/simple/fastapi/: there was a problem confirming the ssl certificate: httpsconnectionpool(host='pypi.org', port=443):

5年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
网站地图