import warnings
import pytest
from fastapi import APIRouter, Depends, FastAPI, Response
from fastapi.responses import JSONResponse
from fastapi.testclient import TestClient
class ResponseLevel0(JSONResponse):
media_type = "application/x-level-0"
class ResponseLevel1(JSONResponse):
media_type = "application/x-level-1"
class ResponseLevel2(JSONResponse):
media_type = "application/x-level-2"
class ResponseLevel3(JSONResponse):
media_type = "application/x-level-3"
class ResponseLevel4(JSONResponse):
media_type = "application/x-level-4"
class ResponseLevel5(JSONResponse):
media_type = "application/x-level-5"
async def dep0(response: Response):
response.headers["x-level0"] = "True"
async def dep1(response: Response):
response.headers["x-level1"] = "True"
async def dep2(response: Response):
response.headers["x-level2"] = "True"
async def dep3(response: Response):
response.headers["x-level3"] = "True"
async def dep4(response: Response):
response.headers["x-level4"] = "True"
async def dep5(response: Response):
response.headers["x-level5"] = "True"
callback_router0 = APIRouter()
@callback_router0.get("/")
async def callback0(level0: str):
pass # pragma: nocover
callback_router1 = APIRouter()
@callback_router1.get("/")
async def callback1(level1: str):
pass # pragma: nocover
callback_router2 = APIRouter()
@callback_router2.get("/")
async def callback2(level2: str):
pass # pragma: nocover
callback_router3 = APIRouter()
@callback_router3.get("/")
async def callback3(level3: str):
pass # pragma: nocover
callback_router4 = APIRouter()
@callback_router4.get("/")
async def callback4(level4: str):
pass # pragma: nocover
callback_router5 = APIRouter()
@callback_router5.get("/")
async def callback5(level5: str):
pass # pragma: nocover
app = FastAPI(
dependencies=[Depends(dep0)],
responses={
400: {"description": "Client error level 0"},
500: {"description": "Server error level 0"},
},
default_response_class=ResponseLevel0,
callbacks=callback_router0.routes,
)
router2_override = APIRouter(
prefix="/level2",
tags=["level2a", "level2b"],
dependencies=[Depends(dep2)],
responses={
402: {"description": "Client error level 2"},
502: {"description": "Server error level 2"},
},
default_response_class=ResponseLevel2,
callbacks=callback_router2.routes,
deprecated=True,
)
router2_default = APIRouter()
router4_override = APIRouter(
prefix="/level4",
tags=["level4a", "level4b"],
dependencies=[Depends(dep4)],
responses={
404: {"description": "Client error level 4"},
504: {"description": "Server error level 4"},
},
default_response_class=ResponseLevel4,
callbacks=callback_router4.routes,
deprecated=True,
)
router4_default = APIRouter()
@app.get(
"/override1",
tags=["path1a", "path1b"],
responses={
401: {"description": "Client error level 1"},
501: {"description": "Server error level 1"},
},
deprecated=True,
callbacks=callback_router1.routes,
dependencies=[Depends(dep1)],
response_class=ResponseLevel1,
)
async def path1_override(level1: str):
return level1
@app.get("/default1")
async def path1_default(level1: str):
return level1
@router2_override.get(
"/override3",
tags=["path3a", "path3b"],
responses={
403: {"description": "Client error level 3"},
503: {"description": "Server error level 3"},
},
deprecated=True,
callbacks=callback_router3.routes,
dependencies=[Depends(dep3)],
response_class=ResponseLevel3,
)
async def path3_override_router2_override(level3: str):
return level3
@router2_override.get("/default3")
async def path3_default_router2_override(level3: str):
return level3
@router2_default.get(
"/override3",
tags=["path3a", "path3b"],
responses={
403: {"description": "Client error level 3"},
503: {"description": "Server error level 3"},
},
deprecated=True,
callbacks=callback_router3.routes,
dependencies=[Depends(dep3)],
response_class=ResponseLevel3,
)
async def path3_override_router2_default(level3: str):
return level3
@router2_default.get("/default3")
async def path3_default_router2_default(level3: str):
return level3
@router4_override.get(
"/override5",
tags=["path5a", "path5b"],
responses={
405: {"description": "Client error level 5"},
505: {"description": "Server error level 5"},
},
deprecated=True,
callbacks=callback_router5.routes,
dependencies=[Depends(dep5)],
response_class=ResponseLevel5,
)
async def path5_override_router4_override(level5: str):
return level5
@router4_override.get(
"/default5",
)
async def path5_default_router4_override(level5: str):
return level5
@router4_default.get(
"/override5",
tags=["path5a", "path5b"],
responses={
405: {"description": "Client error level 5"},
505: {"description": "Server error level 5"},
},
deprecated=True,
callbacks=callback_router5.routes,
dependencies=[Depends(dep5)],
response_class=ResponseLevel5,
)
async def path5_override_router4_default(level5: str):
return level5
@router4_default.get(
"/default5",
)
async def path5_default_router4_default(level5: str):
return level5
router2_override.include_router(
router4_override,
prefix="/level3",
tags=["level3a", "level3b"],
dependencies=[Depends(dep3)],
responses={
403: {"description": "Client error level 3"},
503: {"description": "Server error level 3"},
},
default_response_class=ResponseLevel3,
callbacks=callback_router3.routes,
)
router2_override.include_router(
router4_default,
prefix="/level3",
tags=["level3a", "level3b"],
dependencies=[Depends(dep3)],
responses={
403: {"description": "Client error level 3"},
503: {"description": "Server error level 3"},
},
default_response_class=ResponseLevel3,
callbacks=callback_router3.routes,
)
router2_override.include_router(router4_override)
router2_override.include_router(router4_default)
router2_default.include_router(
router4_override,
prefix="/level3",
tags=["level3a", "level3b"],
dependencies=[Depends(dep3)],
responses={
403: {"description": "Client error level 3"},
503: {"description": "Server error level 3"},
},
default_response_class=ResponseLevel3,
callbacks=callback_router3.routes,
)
router2_default.include_router(
router4_default,
prefix="/level3",
tags=["level3a", "level3b"],
dependencies=[Depends(dep3)],
responses={
403: {"description": "Client error level 3"},
503: {"description": "Server error level 3"},
},
default_response_class=ResponseLevel3,
callbacks=callback_router3.routes,
)
router2_default.include_router(router4_override)
router2_default.include_router(router4_default)
app.include_router(
router2_override,
prefix="/level1",
tags=["level1a", "level1b"],
dependencies=[Depends(dep1)],
responses={
401: {"description": "Client error level 1"},
501: {"description": "Server error level 1"},
},
default_response_class=ResponseLevel1,
callbacks=callback_router1.routes,
)
app.include_router(
router2_default,
prefix="/level1",
tags=["level1a", "level1b"],
dependencies=[Depends(dep1)],
responses={
401: {"description": "Client error level 1"},
501: {"description": "Server error level 1"},
},
default_response_class=ResponseLevel1,
callbacks=callback_router1.routes,
)
app.include_router(router2_override)
app.include_router(router2_default)
client = TestClient(app)
def test_level1_override():
response = client.get("/override1?level1=foo")
assert response.json() == "fo
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源简介: FastAPI,作为当今最受欢迎的高性能Web框架之一,以其卓越的速度、简洁的代码和易用性广受开发者欢迎。本资源深入探索了FastAPI的核心功能,提供了一个全面的指南,用于构建基于现代异步编程技术的高效API。适合追求高性能同时不牺牲开发效率的Python开发者,无论是在构建微服务、处理大规模数据还是创建复杂的业务逻辑应用,FastAPI都能提供强大支持。 主要特性: 高性能:基于Starlette进行异步编程,使得FastAPI在性能上可与NodeJS和Go等语言媲美。 简洁的代码设计:通过Python 3.6+ 类型声明,极大提高了代码质量和开发速度。 强大的依赖注入系统:简化了代码和参数管理,使得构建大型应用更为简便。 自动生成文档:项目代码更改后,Swagger和ReDoc文档会自动更新,大大提升了API的可维护性和开发效率。 丰富的插件支持:社区活跃,提供了大量第三方插件,易于集成多种服务和组件。 适用场景: 企业级应用:构建可扩展的后端服务以支持复杂的业务需求。 启动和技术创新:快速开发原型和迭代产品,特别适合初创公司。 学术和研究:教育机构和研究人员
资源推荐
资源详情
资源评论
收起资源包目录
FastAPI 框架全面解析与实践 (2000个子文件)
custom.css 3KB
termynal.css 2KB
styles.css 25B
main.html 5KB
copyright.html 450B
item.html 235B
termynal.js 9KB
custom.js 7KB
tutorial004.js 1KB
release-notes.md 390KB
docker.md 58KB
docker.md 44KB
docker.md 43KB
async.md 40KB
alternatives.md 39KB
docker.md 39KB
alternatives.md 38KB
query-params-str-validations.md 38KB
docker.md 37KB
python-types.md 36KB
docker.md 34KB
concepts.md 32KB
alternatives.md 32KB
docker.md 31KB
response-model.md 31KB
index.md 30KB
sql-databases.md 30KB
alternatives.md 29KB
docker.md 28KB
async.md 28KB
query-params-str-validations.md 28KB
alternatives.md 27KB
sql-databases.md 27KB
async.md 27KB
alternatives.md 27KB
async.md 27KB
index.md 26KB
index.md 26KB
query-params-str-validations.md 26KB
alternatives.md 26KB
sql-databases.md 25KB
async.md 25KB
index.md 24KB
concepts.md 24KB
index.md 24KB
async.md 24KB
sql-databases-peewee.md 24KB
alternatives.md 23KB
async.md 23KB
oauth2-scopes.md 23KB
index.md 23KB
contributing.md 23KB
help-fastapi.md 22KB
async.md 22KB
index.md 22KB
index.md 22KB
async.md 22KB
index.md 22KB
python-types.md 22KB
index.md 21KB
index.md 21KB
bigger-applications.md 21KB
async.md 21KB
index.md 21KB
concepts.md 21KB
https.md 21KB
oauth2-scopes.md 20KB
index.md 20KB
response-model.md 20KB
index.md 20KB
python-types.md 20KB
dependencies-with-yield.md 20KB
index.md 19KB
index.md 19KB
python-types.md 19KB
index.md 19KB
sql-databases-peewee.md 19KB
index.md 19KB
index.md 19KB
alternatives.md 19KB
async.md 19KB
index.md 19KB
bigger-applications.md 19KB
bigger-applications.md 19KB
index.md 18KB
concepts.md 18KB
response-model.md 18KB
settings.md 18KB
index.md 18KB
index.md 17KB
python-types.md 17KB
deployment.md 17KB
contributing.md 17KB
contributing.md 16KB
features.md 16KB
classes-as-dependencies.md 16KB
concepts.md 16KB
contributing.md 16KB
help-fastapi.md 16KB
response-model.md 16KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
拉叭叭小能手
- 粉丝: 36
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功