【发布时间】:2020-11-15 12:46:10
【问题描述】:
对于个人项目,我将 PonyOrm 与 FastApi 一起使用;有没有一种经典的方法可以在端点的整个异步生命周期调用中保持 db_session ?
PonyOrm 的文档中谈到了使用装饰器和产量;但它对我不起作用,所以在查看了其他 Github 项目后,我发现这个解决方法效果很好。
但我真的不知道幕后发生了什么,以及为什么 Pony 的文档对异步主题不准确。
def _enter_session():
session = db_session(sql_debug=True)
Request.pony_session = session
session.__enter__()
def _exit_session():
session = getattr(Request, 'pony_session', None)
if session is not None:
session.__exit__()
@app.middleware("http")
async def add_pony(request: Request, call_next):
_enter_session()
response = await call_next(request)
_exit_session()
return response
然后在一个依赖中,例如:
async def current_user(
username: str = Depends(current_user_from_token)) -> User:
with Request.pony_session:
# db actions
在端点调用中:
@router.post("/token", response_model=Token)
async def login_for_access_token(
request: Request,
user_agent: Optional[str] = Header(None),
form_data: OAuth2PasswordRequestForm = Depends()):
status: bool = authenticate_user(
form_data.username,
form_data.password,
request.client.host,
user_agent)
@db_session
def authenticate_user(
username: str,
password: str,
client_ip: str = 'Undefined',
client_app: str = 'Undefined'):
user: User = User.get(email=username)
如果你们有更好的方法或好的解释,我很想听听 :)
【问题讨论】:
-
您是否有理由不能遵循其他 orm 文档中列出的模式? IE,只是使用一个简单的依赖?见fastapi.tiangolo.com/tutorial/dependencies/…
-
那里没有任何东西可以阻止您使用正常的依赖项
标签: python-asyncio fastapi ponyorm