📖 Scenario: You are creating a small web API that handles user registrations. Instead of processing everything in one step, you want to use an event-driven approach. When a user registers, an event is triggered to send a welcome email asynchronously.
🎯 Goal: Build a FastAPI application that stores user data, triggers a registration event, and handles that event to simulate sending a welcome email.
📋 What You'll Learn
Create a list called users to store user dictionaries with username and email keys.
Create a variable called event_queue as a list to hold event messages.
Write a function register_user that adds a user dictionary to users and appends a registration event message to event_queue.
Add a FastAPI route /register that accepts JSON with username and email, calls register_user, and returns a confirmation message.
💡 Why This Matters
🌍 Real World
Event-driven architecture helps build scalable and responsive web applications by decoupling user actions from background processing.
💼 Career
Understanding event-driven design and FastAPI is valuable for backend developers building modern APIs and microservices.
Progress0 / 4 steps
1
Create the initial data structures
Create a list called users that is empty and a list called event_queue that is also empty.
FastAPI
Hint
Use empty square brackets [] to create empty lists.
2
Create the user registration function
Define a function called register_user that takes username and email as parameters. Inside the function, create a dictionary with keys 'username' and 'email' and add it to the users list. Then append a string f"User {username} registered" to the event_queue list.
FastAPI
Hint
Use def to define the function and append() to add items to lists.
3
Create the FastAPI app and registration route
Import FastAPI from fastapi. Create an instance called app. Add a POST route /register that accepts JSON with username and email. Inside the route function, call register_user with the received data and return a dictionary with key message and value "User registered successfully".
FastAPI
Hint
Use @app.post('/register') decorator and define an async function that accepts a Pydantic model.
4
Add event processing function
Define a function called process_events that loops over the event_queue list. For each event, remove it from the list and simulate sending an email by creating a string f"Sending email for event: {event}". Call process_events at the end of the register route function.
FastAPI
Hint
Use a while loop to process all events and pop(0) to remove the first event.
Practice
(1/5)
1. What is the main benefit of using event-driven architecture in FastAPI?
easy
A. It allows the app to react to actions immediately without waiting.
B. It makes the app run only on a single thread.
C. It requires no code to handle user requests.
D. It disables background tasks for faster response.
Solution
Step 1: Understand event-driven architecture
Event-driven architecture lets the app respond to events as they happen, improving responsiveness.
Step 2: Connect to FastAPI's use of BackgroundTasks
FastAPI uses BackgroundTasks to handle events without blocking the main user request, enabling immediate reactions.
Final Answer:
It allows the app to react to actions immediately without waiting. -> Option A
Quick Check:
Event-driven = Immediate reaction [OK]
Hint: Event-driven means reacting instantly to actions [OK]
Common Mistakes:
Thinking event-driven means single-threaded only
Believing no code is needed for requests
Assuming background tasks are disabled
2. Which of the following is the correct way to import BackgroundTasks in FastAPI?
easy
A. import BackgroundTasks from fastapi
B. from fastapi.background import Tasks
C. from fastapi import BackgroundTasks
D. import fastapi.BackgroundTasks
Solution
Step 1: Recall FastAPI import syntax
FastAPI uses standard Python import syntax: from module import class/function.
Step 2: Identify correct module and class
The BackgroundTasks class is imported from fastapi directly, so the correct syntax is 'from fastapi import BackgroundTasks'.
Final Answer:
from fastapi import BackgroundTasks -> Option C
Quick Check:
Correct import syntax = from fastapi import BackgroundTasks [OK]
Hint: Use 'from fastapi import BackgroundTasks' to import correctly [OK]
Common Mistakes:
Using wrong import order or syntax
Trying to import from a non-existent submodule
Using dot notation incorrectly in import
3. What will be the output when this FastAPI endpoint is called?
from fastapi import FastAPI, BackgroundTasks
app = FastAPI()
results = []
def write_log(message: str):
results.append(message)
@app.post('/send')
async def send_message(background_tasks: BackgroundTasks):
background_tasks.add_task(write_log, 'Message sent')
return {'status': 'ok'}
# After calling POST /send once, what is the value of results?
medium
A. ['Message sent']
B. [] (empty list)
C. ['Message sent', 'Message sent']
D. Error: background_tasks not defined
Solution
Step 1: Understand BackgroundTasks behavior
BackgroundTasks run after the response is sent, but in testing or immediate inspection, the task may not have run yet.
Step 2: Check when results list updates
The results list is updated inside the background task, which runs asynchronously after returning the response, so immediately after the call, results is still empty.
Final Answer:
[] (empty list) -> Option B
Quick Check:
Background task runs after response = empty results [OK]
Hint: BackgroundTasks run after response, so immediate results stay empty [OK]
Common Mistakes:
Assuming background task runs before return
Expecting results updated synchronously
Confusing background_tasks parameter usage
4. Identify the error in this FastAPI code using BackgroundTasks:
A. BackgroundTasks must be imported from fastapi.background module
B. print function cannot be used in background tasks
C. Missing await keyword before add_task call
D. background_tasks parameter missing in function definition
Solution
Step 1: Check function parameters for BackgroundTasks
The function uses background_tasks but does not declare it as a parameter, so it is undefined inside the function.
Step 2: Confirm correct usage of BackgroundTasks
BackgroundTasks must be accepted as a parameter in the endpoint function to be used, e.g., 'async def notify(background_tasks: BackgroundTasks)'.
Final Answer:
background_tasks parameter missing in function definition -> Option D
Quick Check:
Missing parameter = background_tasks parameter missing in function definition [OK]
Hint: Always add BackgroundTasks as a function parameter to use it [OK]
Common Mistakes:
Forgetting to add background_tasks parameter
Thinking print can't be used in background tasks
Adding await to add_task (it's not a coroutine)
5. You want to send an email notification after a user registers without delaying the response. Which FastAPI pattern best fits this event-driven need?
hard
A. Use BackgroundTasks to send the email after returning the response
B. Send the email synchronously inside the endpoint before returning
C. Use a global variable to store emails and send later manually
D. Call the email function inside a separate thread without FastAPI support
Solution
Step 1: Understand the goal of non-blocking email sending
We want the user to get a quick response while the email sends in the background.
Step 2: Match FastAPI's event-driven feature
BackgroundTasks lets you schedule tasks to run after the response, perfect for sending emails without delay.
Final Answer:
Use BackgroundTasks to send the email after returning the response -> Option A