跳转到主要内容

FastAPI-like界面插件用于Flask

项目描述

目录

简介

Flastapi是一个小的Flask插件,它允许使用pydantic构建API端点,实现类似FastAPI的接口。

当前功能包括

  • 使用Flask路径的路径参数
  • 查询参数
  • 使用pydantic的正文参数
  • 依赖(包括上下文依赖)
  • dependency_overrides

Fastapi在将pydantic集成到API端点的marshaller方面做得很好,方式直观。通过这个库,我希望在flast中也能暴露这些功能,对于那些尚未找到过渡到新技术的能力(或者那些难以应对变化的人)

快速入门

from flask import Flask
from flastapi import FlastAPI, Router

app = Flask(__name__)
flastapi = FlastAPI(app)
router = Router("my_router")

@router.get("/index"):
def index():
    return {}

flastapi.add_router(router)

app.run()

API概述

路径参数

Flask和Fastapi提供类似的路径操作。因此,从Fastapi符号到Flask符号的转换层是没有意义的。

简而言之:我们将坚持使用Flask路径符号 :)

示例端点

@router.get("/test/<int:some_param>")
def index(some_param: int):
    return {"some_param": some_param}

示例调用

>>> client.get("/test/1")
{"some_param": 1}

查询参数

使用内置基类型注解的参数将自动标记为查询参数。可以将查询参数收集到pydantic模型中,有关更多信息,请参阅“查询依赖”部分。

示例端点

@router.get("/test")
def index(some_param: int):
    return {"some_param": some_param}

示例调用

>>> client.get("/test?some_param=1")
{"some_param": 1}

正文参数

使用pydantic模型注解的参数将自动标记为json类型的正文参数。

示例端点

class SomeParam(BaseModel):
    some_int: int


@router.post("/test")
def index(some_param: SomeParam):
    return some_param

示例调用

>>> client.post("/test", json={"some_int": 1})
{"some_int": 1}

多正文参数

可以注释多个pydantic模型。如果这样,参数名称将用作JSON体中的查找键。

示例端点

class SomeParam(BaseModel):
    some_int: int


class AnotherParam(BaseModel):
    some_str: str


@router.post("/test")
def index(some_param: SomeParam, another_param: AnotherParam):
    return [SomeParam, AnotherParam]

示例调用

>>> client.post("/test", json={
    "some_param": {"some_int": 1},
    "another_param": {"some_str": "blah"}
})
[{"some_int": 1}, {"some_str": "blah"}]

查询依赖

如果您想将查询参数分组到pydantic模型中(或通过另一个函数加载它们),可以使用依赖项。

from flastapi import Depends


class SomeParam(BaseModel):
    some_int: int


@router.get("/test")
def index(some_param: SomeParam = Depends(SomeParam)):
    return some_param

示例调用

>>> client.get("/test?some_int=1")
{"some_int": 1}

上下文依赖

依赖项还支持上下文,如果您希望在处理请求之前启动上下文,并在处理请求后关闭上下文。

from flastapi import Depends


def get_session():
    engine = create_engine("sqlite:////tmp/some.db")
    with Session(engine) as session:
        yield session


@router.get("/test")
def index(session: Session = Depends(get_session)):
    return {}

测试依赖

覆盖

您可以通过替换测试中要运行的依赖项来覆盖单元测试中的依赖项

代码

from flastapi import Depends


def get_session():
    engine = create_engine("sqlite:////tmp/some.db")
    with Session(engine) as session:
        yield session


@my_router.get("/test")
def index(session: Session = Depends(get_session)):
    return {}

测试

from pytest import fixture
from flastapi import FlastAPI

from my_project import get_session, my_router


def get_test_session():
    engine = create_engine("sqlite:////tmp/another.db")
    with Session(engine) as session:
        yield session


@pytest.fixture
def app():
    app = Flask(__name__)
    flastapi = FlastAPI()
    flastapi.add_router(my_router)

    flastapi.dependency_overrides[get_session] = get_test_session

使用requests作为测试客户端

如果您想使用requests作为测试客户端,请查看Requests-flask-adapter

路线图

我希望添加的内容

  • 响应类型
  • openAPI/Swagger/ReDoc支持
  • 我需要检查一下在IDE中整个类型系统是如何工作的(抱歉,我是个文本编辑爱好者)

请求功能

如果您觉得遗漏了什么,请随时打开一个问题来请求功能。我只是一个穷程序员,晚上闲着没事做,所以我将尽力提供帮助。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

flastapi-0.1.0.tar.gz (10.9 kB 查看散列)

上传时间

构建分布

flastapi-0.1.0-py2.py3-none-any.whl (8.0 kB 查看散列)

上传时间 Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面