Skip to content

Commit b51af0a

Browse files
authored
Add fastapi example and remove black from dev dependencies (#69)
* Add fastapi example * Remove black from dev dependencies * Recent updates in Cargo.lock * Add fluxqueue object declaration note in docs
1 parent 585c628 commit b51af0a

12 files changed

Lines changed: 77 additions & 14 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/tutorial/defininig_and_exposing_tasks.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,13 @@ from fluxqueue import FluxQueue
103103
fluxqueue = FluxQueue()
104104
```
105105

106+
<!-- prettier-ignore -->
107+
!!! note
108+
Creating a `FluxQueue` instance does **not** open a TCP connection to Redis.
109+
The Redis connection is established only when a task is executed.
110+
Because of this, declaring `fluxqueue` as a global object is safe and will not
111+
create persistent or idle Redis connections.
112+
106113
**`tasks/email.py`**:
107114

108115
```python

examples/fastapi/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# FluxQueue in FastAPI project
2+
3+
This example shows how to use FluxQueue in a FastAPI project. In particular, it demonstrates an endpoint for sending emails asynchronously using `aiosmtplib`.
4+
5+
You might wonder why we are declaring `fluxqueue` object globally.
6+
7+
```py
8+
from fluxqueue import FluxQueue
9+
10+
fluxqueue = FluxQueue()
11+
```
12+
13+
This is safe because initializing the class does not establish a TCP connection to Redis. A connection is only created when a task function is actually executed.

examples/fastapi/src/__init__.py

Whitespace-only changes.

examples/fastapi/src/email/__init__.py

Whitespace-only changes.

examples/fastapi/src/email/core.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from contextlib import asynccontextmanager
2+
3+
import aiosmtplib
4+
5+
6+
@asynccontextmanager
7+
async def get_email_client():
8+
client = aiosmtplib.SMTP(
9+
hostname="localhost",
10+
port=2525,
11+
)
12+
try:
13+
await client.connect()
14+
yield client
15+
finally:
16+
if client.is_connected:
17+
await client.quit()

examples/fastapi/src/main.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from fastapi import FastAPI
2+
3+
from examples.fastapi.src.tasks import send_welcome_email_task
4+
5+
app = FastAPI()
6+
7+
8+
@app.get("/email/{email}")
9+
async def send_welcome_email(email: str):
10+
await send_welcome_email_task(email)
11+
12+
return {"message": "Email was sent"}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
__all__ = ["send_welcome_email_task"]
2+
3+
from .email import send_welcome_email_task

examples/fastapi/src/tasks/core.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from fluxqueue import FluxQueue
2+
3+
fluxqueue = FluxQueue()
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from email.message import EmailMessage
2+
3+
from examples.fastapi.src.email.core import get_email_client
4+
from examples.fastapi.src.tasks.core import fluxqueue
5+
6+
7+
@fluxqueue.task()
8+
async def send_welcome_email_task(to_email: str):
9+
async with get_email_client() as email_client:
10+
message = EmailMessage()
11+
message["From"] = "test@test.com"
12+
message["To"] = to_email
13+
message["Subject"] = "Welcome!"
14+
message.set_content("Thanks for using FluxQueue")
15+
16+
await email_client.send_message(message)

0 commit comments

Comments
 (0)