Close Menu

    Subscribe to Updates

    Get the latest creative news from FooBar about art, design and business.

    What's Hot

    Comprehensive Guide to Monitoring and Observability

    April 21, 2025

    Comprehensive Guide to Cloud-Native Application Development

    April 21, 2025

    Comprehensive Guide to Kubernetes Container Orchestration

    April 21, 2025
    Facebook X (Twitter) Instagram
    Trending
    • Comprehensive Guide to Monitoring and Observability
    • Comprehensive Guide to Cloud-Native Application Development
    • Comprehensive Guide to Kubernetes Container Orchestration
    • Comprehensive Guide to Infrastructure as Code
    • Comprehensive Guide to CI/CD Pipelines
    • Go Backend Development: Gin and Echo Guide
    • Java Backend Development: Spring Boot Guide
    • Python Backend Development: Django and Flask Guide
    Facebook X (Twitter) Instagram
    Ijofed
    Subscribe
    Wednesday, June 11
    • Homepage
    • Frontend
    • Security
    • Devops
    • Backend
    Ijofed
    Home»Backend»Python Backend Development: Django and Flask Guide
    Backend

    Python Backend Development: Django and Flask Guide

    ijofedBy ijofedApril 21, 2025Updated:April 21, 2025No Comments13 Mins Read2 Views

    Introduction to Python Backend Development

    Python has emerged as one of the most popular languages for backend development, offering two powerful frameworks: Django and Flask. Django provides a full-featured, batteries-included framework for building complex web applications, while Flask offers a lightweight, flexible microframework perfect for smaller applications and APIs. This comprehensive guide will explore both frameworks, helping you understand when to use each and how to build robust backend applications with Python.

    The Python ecosystem for web development is rich with libraries and tools that make it an excellent choice for backend development. Django’s built-in admin interface, ORM, and authentication system make it ideal for data-driven applications, while Flask’s simplicity and extensibility make it perfect for microservices and APIs. Both frameworks follow Python’s philosophy of readability and maintainability, making them excellent choices for long-term projects.

    Django Project Structure and Architecture

    Django follows a Model-View-Template (MVT) architecture pattern, which is similar to MVC but with Django’s specific implementation. Let’s examine a comprehensive Django project structure that follows best practices and accommodates growth.

    project-root/
    ├── manage.py
    ├── requirements.txt
    ├── .env
    ├── .gitignore
    ├── README.md
    └── project/
        ├── __init__.py
        ├── settings/
        │   ├── __init__.py
        │   ├── base.py
        │   ├── development.py
        │   └── production.py
        ├── urls.py
        ├── wsgi.py
        └── asgi.py
    └── apps/
        ├── users/
        │   ├── __init__.py
        │   ├── admin.py
        │   ├── apps.py
        │   ├── models.py
        │   ├── views.py
        │   ├── serializers.py
        │   ├── permissions.py
        │   ├── tests/
        │   └── urls.py
        ├── products/
        │   ├── __init__.py
        │   ├── admin.py
        │   ├── apps.py
        │   ├── models.py
        │   ├── views.py
        │   ├── serializers.py
        │   ├── tests/
        │   └── urls.py
        └── core/
            ├── __init__.py
            ├── middleware.py
            ├── pagination.py
            ├── permissions.py
            └── utils.py

    This structure follows Django’s best practices for project organization. The settings are split into different environments (development, production), making it easier to manage configuration. Each app is self-contained with its own models, views, and tests. The core app contains shared functionality like middleware and utilities. This organization makes the project scalable and maintainable.

    Django Models and Database Integration

    Django’s ORM (Object-Relational Mapping) is one of its most powerful features, allowing you to work with databases using Python classes. Let’s implement comprehensive models with proper relationships and validation.

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    from django.core.validators import MinValueValidator, MaxValueValidator
    from django.utils.translation import gettext_lazy as _
    
    class User(AbstractUser):
        email = models.EmailField(_('email address'), unique=True)
        phone_number = models.CharField(max_length=15, blank=True)
        is_verified = models.BooleanField(default=False)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    
        USERNAME_FIELD = 'email'
        REQUIRED_FIELDS = ['username']
    
        class Meta:
            verbose_name = _('user')
            verbose_name_plural = _('users')
            ordering = ['-created_at']
    
        def __str__(self):
            return self.email
    
    class Product(models.Model):
        name = models.CharField(max_length=255)
        description = models.TextField()
        price = models.DecimalField(max_digits=10, decimal_places=2)
        stock = models.PositiveIntegerField(default=0)
        category = models.ForeignKey('Category', on_delete=models.PROTECT)
        created_by = models.ForeignKey(User, on_delete=models.CASCADE)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    
        class Meta:
            ordering = ['-created_at']
            indexes = [
                models.Index(fields=['name']),
                models.Index(fields=['category']),
                models.Index(fields=['created_at']),
            ]
    
        def __str__(self):
            return self.name
    
        def save(self, *args, **kwargs):
            if self.stock < 0:
                raise ValueError("Stock cannot be negative")
            super().save(*args, **kwargs)
    
    class Category(models.Model):
        name = models.CharField(max_length=100, unique=True)
        description = models.TextField(blank=True)
        parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)
        created_at = models.DateTimeField(auto_now_add=True)
    
        class Meta:
            verbose_name_plural = "categories"
            ordering = ['name']
    
        def __str__(self):
            return self.name
    
    class Review(models.Model):
        product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='reviews')
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        rating = models.PositiveIntegerField(
            validators=[MinValueValidator(1), MaxValueValidator(5)]
        )
        comment = models.TextField()
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    
        class Meta:
            unique_together = ['product', 'user']
            ordering = ['-created_at']
    
        def __str__(self):
            return f"{self.user.username}'s review for {self.product.name}"

    These models demonstrate Django’s powerful ORM capabilities. The User model extends Django’s AbstractUser to add custom fields. The Product model includes proper relationships, validation, and indexing. The Category model implements a self-referential relationship for hierarchical categories. The Review model shows how to implement many-to-one relationships with proper constraints. Each model includes metadata for ordering and indexing, and custom methods for validation and string representation.

    Django Views and Serializers

    Django REST framework (DRF) provides powerful tools for building APIs. Let’s implement comprehensive views and serializers for our models.

    from rest_framework import viewsets, permissions, status
    from rest_framework.decorators import action
    from rest_framework.response import Response
    from django.shortcuts import get_object_or_404
    from .models import Product, Review
    from .serializers import ProductSerializer, ReviewSerializer
    from .permissions import IsOwnerOrReadOnly
    
    class ProductViewSet(viewsets.ModelViewSet):
        queryset = Product.objects.all()
        serializer_class = ProductSerializer
        permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
    
        def perform_create(self, serializer):
            serializer.save(created_by=self.request.user)
    
        @action(detail=True, methods=['post'])
        def add_review(self, request, pk=None):
            product = self.get_object()
            serializer = ReviewSerializer(data=request.data)
            
            if serializer.is_valid():
                serializer.save(product=product, user=request.user)
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
        @action(detail=True, methods=['get'])
        def reviews(self, request, pk=None):
            product = self.get_object()
            reviews = product.reviews.all()
            serializer = ReviewSerializer(reviews, many=True)
            return Response(serializer.data)
    
    class ReviewViewSet(viewsets.ModelViewSet):
        queryset = Review.objects.all()
        serializer_class = ReviewSerializer
        permission_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
    
        def perform_create(self, serializer):
            serializer.save(user=self.request.user)
    
        def get_queryset(self):
            queryset = Review.objects.all()
            product_id = self.request.query_params.get('product', None)
            if product_id is not None:
                queryset = queryset.filter(product_id=product_id)
            return queryset
    
    # Serializers
    from rest_framework import serializers
    from django.contrib.auth import get_user_model
    
    User = get_user_model()
    
    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ['id', 'username', 'email', 'date_joined']
            read_only_fields = ['date_joined']
    
    class ProductSerializer(serializers.ModelSerializer):
        reviews = serializers.SerializerMethodField()
        average_rating = serializers.SerializerMethodField()
    
        class Meta:
            model = Product
            fields = ['id', 'name', 'description', 'price', 'stock', 
                     'category', 'created_by', 'created_at', 'reviews', 
                     'average_rating']
            read_only_fields = ['created_by', 'created_at']
    
        def get_reviews(self, obj):
            reviews = obj.reviews.all()
            return ReviewSerializer(reviews, many=True).data
    
        def get_average_rating(self, obj):
            reviews = obj.reviews.all()
            if reviews:
                return sum(review.rating for review in reviews) / reviews.count()
            return 0
    
    class ReviewSerializer(serializers.ModelSerializer):
        user = UserSerializer(read_only=True)
    
        class Meta:
            model = Review
            fields = ['id', 'product', 'user', 'rating', 'comment', 
                     'created_at', 'updated_at']
            read_only_fields = ['user', 'created_at', 'updated_at']

    This implementation shows how to create comprehensive API endpoints using Django REST framework. The ProductViewSet includes custom actions for adding and retrieving reviews. The ReviewViewSet demonstrates filtering and permission handling. The serializers show how to handle relationships and computed fields. The implementation includes proper permission classes and validation.

    Flask Application Structure

    Flask’s simplicity and flexibility make it perfect for building APIs and microservices. Let’s examine a comprehensive Flask application structure that follows best practices.

    project-root/
    ├── app/
    │   ├── __init__.py
    │   ├── config.py
    │   ├── extensions.py
    │   ├── models/
    │   │   ├── __init__.py
    │   │   ├── user.py
    │   │   └── product.py
    │   ├── schemas/
    │   │   ├── __init__.py
    │   │   ├── user.py
    │   │   └── product.py
    │   ├── api/
    │   │   ├── __init__.py
    │   │   ├── users.py
    │   │   └── products.py
    │   ├── auth/
    │   │   ├── __init__.py
    │   │   └── jwt.py
    │   └── utils/
    │       ├── __init__.py
    │       ├── validators.py
    │       └── helpers.py
    ├── tests/
    │   ├── __init__.py
    │   ├── test_users.py
    │   └── test_products.py
    ├── requirements.txt
    ├── .env
    ├── .gitignore
    └── run.py

    This structure follows Flask’s best practices for application organization. The app directory contains the main application code, with separate directories for models, schemas, API routes, authentication, and utilities. The tests directory contains test files. This organization makes the application modular and maintainable.

    Flask Models and Database Integration

    Flask-SQLAlchemy provides a powerful ORM for Flask applications. Let’s implement comprehensive models with proper relationships and validation.

    from datetime import datetime
    from flask_sqlalchemy import SQLAlchemy
    from werkzeug.security import generate_password_hash, check_password_hash
    from flask_login import UserMixin
    from app.extensions import db
    
    class User(UserMixin, db.Model):
        __tablename__ = 'users'
        
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(80), unique=True, nullable=False)
        email = db.Column(db.String(120), unique=True, nullable=False)
        password_hash = db.Column(db.String(128))
        is_verified = db.Column(db.Boolean, default=False)
        created_at = db.Column(db.DateTime, default=datetime.utcnow)
        updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    
        products = db.relationship('Product', backref='creator', lazy=True)
        reviews = db.relationship('Review', backref='user', lazy=True)
    
        def set_password(self, password):
            self.password_hash = generate_password_hash(password)
    
        def check_password(self, password):
            return check_password_hash(self.password_hash, password)
    
        def __repr__(self):
            return f''
    
    class Product(db.Model):
        __tablename__ = 'products'
        
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(255), nullable=False)
        description = db.Column(db.Text)
        price = db.Column(db.Numeric(10, 2), nullable=False)
        stock = db.Column(db.Integer, default=0)
        category_id = db.Column(db.Integer, db.ForeignKey('categories.id'))
        created_by_id = db.Column(db.Integer, db.ForeignKey('users.id'))
        created_at = db.Column(db.DateTime, default=datetime.utcnow)
        updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    
        reviews = db.relationship('Review', backref='product', lazy=True)
    
        def __repr__(self):
            return f''
    
    class Category(db.Model):
        __tablename__ = 'categories'
        
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(100), unique=True, nullable=False)
        description = db.Column(db.Text)
        parent_id = db.Column(db.Integer, db.ForeignKey('categories.id'))
        created_at = db.Column(db.DateTime, default=datetime.utcnow)
    
        products = db.relationship('Product', backref='category', lazy=True)
        children = db.relationship('Category', backref=db.backref('parent', remote_side=[id]))
    
        def __repr__(self):
            return f''
    
    class Review(db.Model):
        __tablename__ = 'reviews'
        
        id = db.Column(db.Integer, primary_key=True)
        product_id = db.Column(db.Integer, db.ForeignKey('products.id'), nullable=False)
        user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
        rating = db.Column(db.Integer, nullable=False)
        comment = db.Column(db.Text)
        created_at = db.Column(db.DateTime, default=datetime.utcnow)
        updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    
        __table_args__ = (
            db.UniqueConstraint('product_id', 'user_id', name='unique_product_user_review'),
        )
    
        def __repr__(self):
            return f''

    These models demonstrate SQLAlchemy’s powerful ORM capabilities. The User model includes password hashing and verification. The Product model includes proper relationships and timestamps. The Category model implements a self-referential relationship for hierarchical categories. The Review model shows how to implement many-to-one relationships with proper constraints. Each model includes proper table configuration and string representation.

    Flask API Implementation

    Flask-RESTful provides a simple way to build REST APIs with Flask. Let’s implement comprehensive API endpoints with proper validation and authentication.

    from flask import request, jsonify
    from flask_restful import Resource, Api, reqparse
    from flask_jwt_extended import jwt_required, get_jwt_identity
    from app.models import User, Product, Review
    from app.schemas import UserSchema, ProductSchema, ReviewSchema
    from app.extensions import db
    from app.utils.validators import validate_product_data
    
    api = Api()
    
    class UserResource(Resource):
        def post(self):
            parser = reqparse.RequestParser()
            parser.add_argument('username', required=True)
            parser.add_argument('email', required=True)
            parser.add_argument('password', required=True)
            args = parser.parse_args()
    
            if User.query.filter_by(username=args['username']).first():
                return {'message': 'Username already exists'}, 400
            if User.query.filter_by(email=args['email']).first():
                return {'message': 'Email already exists'}, 400
    
            user = User(username=args['username'], email=args['email'])
            user.set_password(args['password'])
            db.session.add(user)
            db.session.commit()
    
            return UserSchema().dump(user), 201
    
    class ProductResource(Resource):
        @jwt_required()
        def post(self):
            data = request.get_json()
            errors = validate_product_data(data)
            if errors:
                return {'errors': errors}, 400
    
            current_user_id = get_jwt_identity()
            product = Product(
                name=data['name'],
                description=data['description'],
                price=data['price'],
                stock=data['stock'],
                category_id=data['category_id'],
                created_by_id=current_user_id
            )
            db.session.add(product)
            db.session.commit()
    
            return ProductSchema().dump(product), 201
    
        def get(self, product_id=None):
            if product_id:
                product = Product.query.get_or_404(product_id)
                return ProductSchema().dump(product)
            
            products = Product.query.all()
            return ProductSchema(many=True).dump(products)
    
    class ReviewResource(Resource):
        @jwt_required()
        def post(self, product_id):
            parser = reqparse.RequestParser()
            parser.add_argument('rating', type=int, required=True)
            parser.add_argument('comment')
            args = parser.parse_args()
    
            if not 1 <= args['rating'] <= 5:
                return {'message': 'Rating must be between 1 and 5'}, 400
    
            product = Product.query.get_or_404(product_id)
            current_user_id = get_jwt_identity()
    
            if Review.query.filter_by(
                product_id=product_id,
                user_id=current_user_id
            ).first():
                return {'message': 'You have already reviewed this product'}, 400
    
            review = Review(
                product_id=product_id,
                user_id=current_user_id,
                rating=args['rating'],
                comment=args.get('comment')
            )
            db.session.add(review)
            db.session.commit()
    
            return ReviewSchema().dump(review), 201
    
    # Register resources
    api.add_resource(UserResource, '/api/users')
    api.add_resource(ProductResource, '/api/products', '/api/products/')
    api.add_resource(ReviewResource, '/api/products//reviews')

    This implementation shows how to create comprehensive API endpoints using Flask-RESTful. The UserResource handles user registration. The ProductResource demonstrates CRUD operations with authentication. The ReviewResource shows how to handle nested resources and validation. The implementation includes proper error handling and response formatting.

    Authentication and Authorization

    Both Django and Flask provide robust authentication systems. Let’s implement comprehensive authentication and authorization for both frameworks.

    # Django Authentication
    from django.contrib.auth import authenticate
    from rest_framework_simplejwt.tokens import RefreshToken
    from rest_framework.permissions import IsAuthenticated
    from rest_framework.decorators import permission_classes
    
    class LoginView(APIView):
        def post(self, request):
            email = request.data.get('email')
            password = request.data.get('password')
            
            user = authenticate(email=email, password=password)
            if user is None:
                return Response(
                    {'error': 'Invalid credentials'},
                    status=status.HTTP_401_UNAUTHORIZED
                )
            
            refresh = RefreshToken.for_user(user)
            return Response({
                'refresh': str(refresh),
                'access': str(refresh.access_token),
            })
    
    # Flask Authentication
    from flask_jwt_extended import create_access_token, create_refresh_token
    from flask_jwt_extended import jwt_required, get_jwt_identity
    from functools import wraps
    
    def admin_required(fn):
        @wraps(fn)
        @jwt_required()
        def wrapper(*args, **kwargs):
            current_user_id = get_jwt_identity()
            user = User.query.get(current_user_id)
            if not user or not user.is_admin:
                return {'message': 'Admin access required'}, 403
            return fn(*args, **kwargs)
        return wrapper
    
    class AuthResource(Resource):
        def post(self):
            parser = reqparse.RequestParser()
            parser.add_argument('email', required=True)
            parser.add_argument('password', required=True)
            args = parser.parse_args()
    
            user = User.query.filter_by(email=args['email']).first()
            if not user or not user.check_password(args['password']):
                return {'message': 'Invalid credentials'}, 401
    
            access_token = create_access_token(identity=user.id)
            refresh_token = create_refresh_token(identity=user.id)
            
            return {
                'access_token': access_token,
                'refresh_token': refresh_token
            }, 200
    
    class ProtectedResource(Resource):
        @jwt_required()
        def get(self):
            current_user_id = get_jwt_identity()
            user = User.query.get(current_user_id)
            return {'message': f'Hello, {user.username}!'}
    
    class AdminResource(Resource):
        @admin_required
        def get(self):
            return {'message': 'Admin access granted'}

    This implementation shows how to handle authentication and authorization in both Django and Flask. The Django implementation uses JWT tokens and includes a login view. The Flask implementation shows how to create custom decorators for role-based access control and includes token-based authentication. Both implementations include proper error handling and token management.

    Testing and Quality Assurance

    Both Django and Flask provide excellent testing frameworks. Let’s implement comprehensive tests for our applications.

    # Django Tests
    from django.test import TestCase
    from django.urls import reverse
    from rest_framework.test import APIClient
    from rest_framework import status
    from .models import User, Product
    
    class UserTests(TestCase):
        def setUp(self):
            self.client = APIClient()
            self.user_data = {
                'username': 'testuser',
                'email': 'test@example.com',
                'password': 'testpass123'
            }
            self.user = User.objects.create_user(**self.user_data)
    
        def test_user_registration(self):
            url = reverse('user-register')
            data = {
                'username': 'newuser',
                'email': 'new@example.com',
                'password': 'newpass123'
            }
            response = self.client.post(url, data, format='json')
            self.assertEqual(response.status_code, status.HTTP_201_CREATED)
            self.assertEqual(User.objects.count(), 2)
    
        def test_user_login(self):
            url = reverse('token-obtain-pair')
            data = {
                'email': self.user_data['email'],
                'password': self.user_data['password']
            }
            response = self.client.post(url, data, format='json')
            self.assertEqual(response.status_code, status.HTTP_200_OK)
            self.assertIn('access', response.data)
            self.assertIn('refresh', response.data)
    
    # Flask Tests
    import unittest
    from flask import current_app
    from app import create_app, db
    from app.models import User, Product
    
    class TestCase(unittest.TestCase):
        def setUp(self):
            self.app = create_app('testing')
            self.app_context = self.app.app_context()
            self.app_context.push()
            db.create_all()
            self.client = self.app.test_client()
    
        def tearDown(self):
            db.session.remove()
            db.drop_all()
            self.app_context.pop()
    
        def test_user_registration(self):
            response = self.client.post('/api/users', json={
                'username': 'testuser',
                'email': 'test@example.com',
                'password': 'testpass123'
            })
            self.assertEqual(response.status_code, 201)
            self.assertEqual(User.query.count(), 1)
    
        def test_user_login(self):
            user = User(username='testuser', email='test@example.com')
            user.set_password('testpass123')
            db.session.add(user)
            db.session.commit()
    
            response = self.client.post('/api/auth', json={
                'email': 'test@example.com',
                'password': 'testpass123'
            })
            self.assertEqual(response.status_code, 200)
            self.assertIn('access_token', response.get_json())
            self.assertIn('refresh_token', response.get_json())

    These test implementations show how to write comprehensive tests for both Django and Flask applications. The Django tests demonstrate API testing with the APIClient and include user registration and login tests. The Flask tests show how to set up a test environment and include similar functionality tests. Both implementations include proper setup and teardown methods and demonstrate best practices for testing web applications.

    Deployment and Monitoring

    Deploying Python web applications requires careful consideration of various factors. Let’s implement deployment configurations for both Django and Flask applications.

    # Django Deployment (settings/production.py)
    import os
    from .base import *
    
    DEBUG = False
    ALLOWED_HOSTS = ['yourdomain.com', 'www.yourdomain.com']
    
    # Database
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': os.getenv('DB_NAME'),
            'USER': os.getenv('DB_USER'),
            'PASSWORD': os.getenv('DB_PASSWORD'),
            'HOST': os.getenv('DB_HOST'),
            'PORT': os.getenv('DB_PORT'),
        }
    }
    
    # Static files
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    
    # Security
    SECURE_SSL_REDIRECT = True
    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True
    SECURE_BROWSER_XSS_FILTER = True
    SECURE_CONTENT_TYPE_NOSNIFF = True
    SECURE_HSTS_SECONDS = 31536000
    SECURE_HSTS_INCLUDE_SUBDOMAINS = True
    SECURE_HSTS_PRELOAD = True
    
    # Logging
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'file': {
                'level': 'ERROR',
                'class': 'logging.FileHandler',
                'filename': '/var/log/django/error.log',
            },
        },
        'loggers': {
            'django': {
                'handlers': ['file'],
                'level': 'ERROR',
                'propagate': True,
            },
        },
    }
    
    # Flask Deployment (config.py)
    import os
    from datetime import timedelta
    
    class ProductionConfig:
        DEBUG = False
        TESTING = False
        
        # Database
        SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL')
        SQLALCHEMY_TRACK_MODIFICATIONS = False
        
        # Security
        SECRET_KEY = os.getenv('SECRET_KEY')
        JWT_SECRET_KEY = os.getenv('JWT_SECRET_KEY')
        JWT_ACCESS_TOKEN_EXPIRES = timedelta(hours=1)
        JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=30)
        
        # CORS
        CORS_ORIGINS = os.getenv('CORS_ORIGINS', '').split(',')
        
        # Logging
        LOG_TO_STDOUT = os.getenv('LOG_TO_STDOUT')
        LOG_LEVEL = 'ERROR'
        
        # Redis
        REDIS_URL = os.getenv('REDIS_URL')
        
        # Celery
        CELERY_BROKER_URL = os.getenv('CELERY_BROKER_URL')
        CELERY_RESULT_BACKEND = os.getenv('CELERY_RESULT_BACKEND')
    
    # Gunicorn Configuration (gunicorn.conf.py)
    import multiprocessing
    
    bind = "0.0.0.0:8000"
    workers = multiprocessing.cpu_count() * 2 + 1
    worker_class = 'gthread'
    threads = 2
    timeout = 120
    keepalive = 5
    max_requests = 1000
    max_requests_jitter = 50
    accesslog = '-'
    errorlog = '-'
    loglevel = 'info'

    This deployment configuration shows how to set up both Django and Flask applications for production. The Django configuration includes database settings, static files handling, security settings, and logging configuration. The Flask configuration includes similar settings along with JWT configuration, CORS settings, and Celery configuration for background tasks. The Gunicorn configuration shows how to optimize the WSGI server for production use.

    Additional Resources

    To further enhance your Python backend development skills, consider exploring these resources:

    • Django Documentation
    • Flask Documentation
    • Django REST Framework Documentation
    • Flask-SQLAlchemy Documentation
    • Flask-JWT-Extended Documentation
    Follow on Google News Follow on Flipboard
    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    Previous ArticleNode.js Backend Development: A Comprehensive Guide
    Next Article Java Backend Development: Spring Boot Guide
    ijofed
    • Website

    Related Posts

    Go Backend Development: Gin and Echo Guide

    April 21, 2025

    Java Backend Development: Spring Boot Guide

    April 21, 2025

    Node.js Backend Development: A Comprehensive Guide

    April 21, 2025
    Leave A Reply Cancel Reply

    Latest Posts

    Comprehensive Guide to Monitoring and Observability

    April 21, 20254 Views

    Comprehensive Guide to Cloud-Native Application Development

    April 21, 20252 Views

    Comprehensive Guide to Kubernetes Container Orchestration

    April 21, 20251 Views

    Comprehensive Guide to Infrastructure as Code

    April 21, 20251 Views
    Stay In Touch
    • Facebook
    • Twitter
    • Pinterest
    • Instagram
    • YouTube
    • Vimeo
    Don't Miss

    Go Backend Development: Gin and Echo Guide

    By ijofedApril 21, 2025

    Introduction to Go Backend Development Go (Golang) has emerged as a powerful language for building…

    Comprehensive Guide to Monitoring and Observability

    April 21, 2025

    HTTPS & SSL/TLS: Securing Your Web Traffic

    April 21, 2025

    Subscribe to Updates

    Get the latest creative news from SmartMag about art & design.

    © 2025 ThemeSphere. Designed by ThemeSphere.
    • About Us
    • Contact Us
    • Terms and Conditions
    • Disclaimer
    • Privacy Policy

    Type above and press Enter to search. Press Esc to cancel.