The service layer pattern helps organize your Flask app by keeping business logic separate from routes. It makes your code cleaner and easier to manage.
0
0
Service layer pattern in Flask
Introduction
When your Flask app grows and routes become cluttered with logic.
When you want to reuse business logic in different parts of your app.
When you want to keep your code easy to test and maintain.
When you want to separate data handling from how requests are processed.
Syntax
Flask
class ServiceLayer: def __init__(self, repository): self.repository = repository def perform_action(self, data): # business logic here processed = data.upper() self.repository.save(processed) return processed
The service layer is usually a class that holds business logic methods.
It often uses a repository or data access layer to handle database operations.
Examples
This example shows a service class that processes usernames before saving.
Flask
class UserService: def __init__(self, user_repo): self.user_repo = user_repo def create_user(self, username): username = username.strip().lower() self.user_repo.add(username) return f"User {username} created"
This service validates order data before saving it.
Flask
class OrderService: def __init__(self, order_repo): self.order_repo = order_repo def place_order(self, order_data): # validate order if not order_data.get('items'): raise ValueError('No items in order') self.order_repo.save(order_data) return 'Order placed successfully'
Sample Program
This Flask app uses a service layer to handle user creation logic. The route calls the service, which processes the username and saves it via the repository. The repository stores users in memory.
Flask
from flask import Flask, request, jsonify app = Flask(__name__) class UserRepository: def __init__(self): self.users = [] def add(self, username): self.users.append(username) def list_all(self): return self.users class UserService: def __init__(self, user_repo): self.user_repo = user_repo def create_user(self, username): username = username.strip().lower() self.user_repo.add(username) return username user_repo = UserRepository() user_service = UserService(user_repo) @app.route('/users', methods=['POST']) def add_user(): data = request.json username = data.get('username', '') if not username: return jsonify({'error': 'Username is required'}), 400 user = user_service.create_user(username) return jsonify({'message': f'User {user} created'}) @app.route('/users', methods=['GET']) def get_users(): users = user_repo.list_all() return jsonify({'users': users}) if __name__ == '__main__': app.run(debug=True)
OutputSuccess
Important Notes
Keep your service layer focused on business rules, not HTTP details.
Use the service layer to make your routes simpler and easier to read.
Testing services separately from routes helps catch bugs early.
Summary
The service layer separates business logic from Flask routes.
It improves code organization, reuse, and testing.
Use it when your app logic grows beyond simple route handlers.