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 查看散列)
关闭
flastapi-0.1.0.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 9e264258c453b030c6363e001f4e6642e3a73ed10adf6c2939fa5feb3a448c7b |
|
MD5 | 73c78ec4026f1fc0bf78b12cf4dacbcd |
|
BLAKE2b-256 | 881a1cc382cde671d02016b4c6d6392f1f295c47bc5089a55c3befbe95217e5d |
关闭
flastapi-0.1.0-py2.py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 94d0fdd220e9e64a7eb46574dd9abf5bc67ba8299589258633db2f0c84c4624c |
|
MD5 | b9a815756c5a0d512d4996238210e257 |
|
BLAKE2b-256 | caa553f1db0b40cc2c2e350440f6854612438f4956488405cc9c309e9b950903 |