0
0
Flaskframework~5 mins

Service layer pattern in Flask

Choose your learning style9 modes available
Introduction

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.

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.