Aha*_*ebi 6 python plugins middleware starlette fastapi
出于某些原因,我们选择了FastAPI,以便将其用作多模块生产的后端层。它吸引人的功能之一是子应用程序,它可以帮助我们分离不同的模块,从而使其更加模块化。但我们担心官方文档中缺少的一些可能的缺陷。有大量的通用事物——例如数据、服务等——我们需要通过插件、中间件和依赖注入在主模块和子模块之间共享它们。问题是:这个功能对于单独的模块来说是否足够好?所以:子应用程序是否继承父应用程序的中间件、插件和依赖注入?
感谢您分享您的经验。
from fastapi import FastAPI
app = FastAPI()
@app.get("/app")
def read_main():
return {"message": "Hello World from main app"}
subapi = FastAPI()
@subapi.get("/sub")
def read_sub():
return {"message": "Hello World from sub API"}
app.mount("/subapi", subapi)
Run Code Online (Sandbox Code Playgroud)
Yag*_*nci 10
“挂载”是指添加一个完全“独立”的应用程序。
不管怎样,让我们继续你的例子。
这就是我们获得的 subapi 路线。
[{"path":route.path} for route in subapi.routes] = [
{'path': '/openapi.json'},
{'path': '/docs'},
{'path': '/docs/oauth2-redirect'},
{'path': '/redoc'},
{'path': '/sub'}
]
Run Code Online (Sandbox Code Playgroud)
这就是我们获得的应用程序路线。
[{"path":route.path} for route in app.routes] = [{'path': '/openapi.json'},
{'path': '/docs'},
{'path': '/docs/oauth2-redirect'},
{'path': '/redoc'},
{'path': '/app'},
{'path': '/subapi'}
]
Run Code Online (Sandbox Code Playgroud)
这很有趣,因为我们的 subapi 没有继承/app,让我们继续让事情变得更有趣,让我们用一个命令运行我们的应用程序
uvicorn my_app_name:app
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,我们的应用程序文档位于/docs
另外,我们在 中还有 subapi 的文档/subapi/docs,这里没有什么有趣的。
那么,当我们添加这个时,我们应该期待什么?
subapi.mount("/app", app)
Run Code Online (Sandbox Code Playgroud)
让我们再次运行它,但这次我们调用 subapi。
uvicorn my_app_name:subapi
Run Code Online (Sandbox Code Playgroud)
我们期望看到什么?
/docs/app/docs是的,我们是对的,但事情从这里开始变得有趣。
现在我们有了像俄罗斯套娃这样的应用程序
/app/subapi/sub当我们向(提醒我们运行我们的应用程序uvicorn my_app_name:subapi)发送请求时
curl http://127.0.0.1:8000/app/subapi/sub
Out: {"message":"Hello World from sub API"}
Run Code Online (Sandbox Code Playgroud)
看起来效果很好,但让我们尝试更多。
关于什么/app/subapi/app/subapi/app/subapi/app/subapi/app/subapi/app/app
curl http://127.0.0.1:8000/app/subapi/app/subapi/app/subapi/app/subapi/app/subapi/app/app
Out: {"message":"Hello World from main app"}
Run Code Online (Sandbox Code Playgroud)
你困惑吗?别这样,听我解释一下。
当您安装子应用程序时,FastAPI 会使用 ASGI 规范中称为“a”的机制来处理已安装的应用程序。root_path
root_path上面的例子有什么作用以及为什么有效?
直接说,您可以从您的root_path中到达您在您定义的所有路线,让我们想象一下这一点。app.routesroot_path
现在我们的root_path是/app
/app/
Run Code Online (Sandbox Code Playgroud)
让我们添加 subapi,它就成为我们的root_path.
/app/subapi/
Run Code Online (Sandbox Code Playgroud)
让我们再次添加应用程序,它就成为我们的了root_path
/app/subapi/app
Run Code Online (Sandbox Code Playgroud)
你是不是不满意,说如果我加一个中间件,会发生什么?
容易回答,不会继承。
让我用一个简单的例子来解释这一点,我将为我的 subapi 添加一个中间件。
from fastapi.middleware.cors import CORSMiddleware
subapi.add_middleware(CORSMiddleware)
Run Code Online (Sandbox Code Playgroud)
您的应用程序的所有数据都位于__dict__
因此我们可以通过检查“user_middleware”键轻松找出差异。
subapi.__dict__['user_middleware'] = [Middleware(CORSMiddleware)]
app.__dict__['user_middleware'] = []
Run Code Online (Sandbox Code Playgroud)
您添加的所有其他内容等都将独立工作,因为它们是完全不同的应用程序,因此您将安全地使用安装。
| 归档时间: |
|
| 查看次数: |
10621 次 |
| 最近记录: |