📖 Scenario: You are creating a simple Flask web app to manage a list of books. You want to keep your code clean by separating the logic that handles book data from the web routes. This is done using a service layer.
🎯 Goal: Build a Flask app with a service layer that manages book data separately from the route handlers.
📋 What You'll Learn
Create a list of books as initial data
Add a configuration variable for minimum title length
Implement a service class with a method to get books with titles longer than the minimum length
Use the service class in a Flask route to display filtered books
💡 Why This Matters
🌍 Real World
Service layers help keep web apps organized by separating business logic from web routes, making code easier to maintain and test.
💼 Career
Understanding service layers is important for backend developers working with Flask or similar frameworks to build clean, scalable applications.
Progress0 / 4 steps
1
DATA SETUP: Create the initial book list
Create a list called books with these exact dictionaries: {'id': 1, 'title': 'Flask Basics'}, {'id': 2, 'title': 'Advanced Flask'}, and {'id': 3, 'title': 'Python Tips'}.
Flask
Hint
Use a list with dictionaries inside. Each dictionary has keys 'id' and 'title'.
2
CONFIGURATION: Add minimum title length variable
Create a variable called MIN_TITLE_LENGTH and set it to 12.
Flask
Hint
Just create a variable with the exact name and value.
3
CORE LOGIC: Implement the BookService class
Create a class called BookService with an __init__ method that takes books and min_length. Add a method called get_long_titles that returns a list of books with titles longer than min_length. Use a list comprehension with book['title'] and min_length.
Flask
Hint
Use a class with an __init__ method to save books and min_length. Use a list comprehension in get_long_titles.
4
COMPLETION: Use BookService in a Flask route
Import Flask and create an app with app = Flask(__name__). Create a route @app.route('/books') with a function show_books. Inside it, create a BookService instance with books and MIN_TITLE_LENGTH. Return a string joining the titles from get_long_titles() separated by commas.
Flask
Hint
Import Flask, create app, define route, create service instance, get filtered books, join titles, and return string.
Practice
(1/5)
1. What is the main purpose of using a service layer in a Flask application?
easy
A. To serve static files like images and CSS
B. To separate business logic from route handlers for better organization
C. To handle database migrations automatically
D. To manage user sessions and cookies
Solution
Step 1: Understand the role of service layer
The service layer is designed to hold business logic separate from Flask routes, making code cleaner and easier to maintain.
Step 2: Compare with other options
Handling migrations, serving static files, and managing sessions are not the service layer's responsibilities.
Final Answer:
To separate business logic from route handlers for better organization -> Option B
Quick Check:
Service layer = separates business logic [OK]
Hint: Service layer = business logic outside routes [OK]
Common Mistakes:
Confusing service layer with database or session management
Thinking service layer serves static files
Assuming service layer handles HTTP requests directly
2. Which of the following is the correct way to call a service function get_user_by_id inside a Flask route?
easy
A. user = get_user_by_id(id)
B. user = service->get_user_by_id(id)
C. user = service.get_user_by_id(id)
D. user = get_user_by_id.service(id)
Solution
Step 1: Understand typical service layer usage
Service functions are usually grouped in a service object or module, so calling service.get_user_by_id(id) is correct.
Step 2: Identify syntax errors in other options
user = get_user_by_id(id) misses the service prefix, B uses invalid arrow syntax (->) for Python, C uses wrong dot notation.
Final Answer:
user = service.get_user_by_id(id) -> Option C
Quick Check:
Call service function with dot notation [OK]
Hint: Call service functions as service.function(args) [OK]
Common Mistakes:
Calling service functions without service prefix
Using invalid syntax like arrows (->)
Misplacing dot notation
3. Given this Flask route and service layer code, what will be the output when accessing /user/2 if user with ID 2 exists?
from flask import Flask, jsonify
app = Flask(__name__)
class UserService:
def get_user_by_id(self, user_id):
users = {1: 'Alice', 2: 'Bob'}
return users.get(user_id, None)
service = UserService()
@app.route('/user/<int:user_id>')
def user(user_id):
user_name = service.get_user_by_id(user_id)
if user_name:
return jsonify({'user': user_name})
else:
return jsonify({'error': 'User not found'}), 404
medium
A. {"error": "User not found"}
B. Server error due to missing user
C. 404 Not Found error without JSON
D. {"user": "Bob"}
Solution
Step 1: Check user existence in service
User with ID 2 exists in the dictionary as 'Bob', so get_user_by_id(2) returns 'Bob'.
Step 2: Analyze route response
Since user_name is truthy, route returns JSON with {'user': 'Bob'} and status 200.
Final Answer:
{"user": "Bob"} -> Option D
Quick Check:
User found returns JSON with user name [OK]
Hint: If user exists, route returns JSON with user name [OK]
Common Mistakes:
Assuming 404 error when user exists
Confusing JSON error message with missing user
Thinking server error occurs without exception
4. Identify the error in this Flask route using a service layer:
from flask import Flask, jsonify
app = Flask(__name__)
class UserService:
def get_user(self, user_id):
return None
service = UserService()
@app.route('/user/<int:user_id>')
def user(user_id):
user = service.get_user(user_id)
if user:
return jsonify({'user': user})
else:
return jsonify({'error': 'User not found'})
medium
A. The service method always returns None, so user is never found
B. The route decorator syntax is incorrect
C. Missing return statement in the else block
D. Flask app is not instantiated properly
Solution
Step 1: Analyze service method return value
The get_user method always returns None, so user is always None in the route.
Step 2: Understand route behavior
Because user is None, the route always returns the error JSON, meaning no user is ever found.
Final Answer:
The service method always returns None, so user is never found -> Option A
Quick Check:
Service returns None means no user found [OK]
Hint: Check service method return values carefully [OK]
Common Mistakes:
Assuming route decorator is wrong
Missing return in else block (actually present)
Thinking Flask app is not created properly
5. You want to add a new service method create_user that saves a user and returns the new user ID. Which approach best follows the service layer pattern in Flask?
medium
A. Add create_user method in service class and call it from route
B. Write database code directly in the route
C. Put user creation logic in app initialization
D. Use global variable in route without service
Solution
Step 1: Recall service layer purpose
The service layer should contain business logic like user creation, keeping routes simple and clean.
Step 2: Evaluate options
Add create_user method in service class and call it from route correctly adds create_user to the service class and calls it from the route, following the pattern.
Final Answer:
Add create_user method in service class and call it from route -> Option A
Quick Check:
Business logic in service, routes call service [OK]
Hint: Put business logic in service, call from routes [OK]
Common Mistakes:
Putting logic directly in routes
Using global variables instead of service
Placing logic in app initialization
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.