-
-
Notifications
You must be signed in to change notification settings - Fork 306
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Starlette lifespan handler implementation #683
base: master
Are you sure you want to change the base?
Conversation
1275379
to
c1c65b1
Compare
Looks like project is still alive. Rebased with latest |
|
||
if result is not None: | ||
await result | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi!
Thanks for the nice change. Perhaps it would be appropriate to add an explicit return None
at the end of __aenter__
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You generally want explicit return None
at the end if you return
ed something earlier in the function. There are no returns at all here, so this is extra.
def __call__(self, app: Any) -> Self: | ||
return self | ||
|
||
async def __aenter__(self) -> None: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here you need to change the return type probably to Optional[Awaitable]
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- This method will be inferred as
def __aenter__(self) -> Awaitable[None]:
-> Optional[Awaitable]
means function returns eitherNone
or something that you canawait
(e.g. signature of theinit_resources
). Given the pt.1, annotating it with your suggestion will result inAwaitable[Optional[Awaitable]]
, which does not conforms to StatelessLifespan protocol.
Starlette recently added cool new feature called lifespan in v0.26.0 and FastAPI followed the suit in v0.93.0. This makes it possible to get rid of good chunk of initialization spaghetti in starlette-based apps (making container a single entry point in the application), + reduces amount of the pain in the ass scheduling background tasks in the event loop of the ASGI app.
Example
myapp/container.py
myapp/asgi.py
:run.sh
: