Django REST Framework Fortgeschritten: JWT-Authentifizierung und Throttling

  • 26 Dez 2025
  • CODLAB Team
  • 2 min
  • 307

Einführung in Fortgeschrittene APIs

Django REST Framework (DRF) bietet fortgeschrittene Funktionen zum Erstellen von Enterprise-Grade-APIs. In diesem Tutorial erkunden wir JWT-Authentifizierung, Throttling und benutzerdefinierte Berechtigungen.

1. JWT-Authentifizierung

JSON Web Tokens (JWT) sind der Standard für zustandslose Authentifizierung in modernen APIs.

Installation

pip install djangorestframework-simplejwt

Konfiguration in settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

from datetime import timedelta

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': True,
    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'AUTH_HEADER_TYPES': ('Bearer',),
}

URLs für Token

from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
    TokenVerifyView,
)

urlpatterns = [
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
]

2. API-Throttling

Throttling begrenzt die Anzahl der Anfragen, um Missbrauch zu verhindern und Stabilität zu gewährleisten.

Globale Konfiguration

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/hour',      # Anonyme Benutzer
        'user': '1000/hour',     # Authentifizierte Benutzer
        'burst': '60/minute',    # Burst-Rate
    }
}

Benutzerdefiniertes Throttling

from rest_framework.throttling import UserRateThrottle

class PremiumUserThrottle(UserRateThrottle):
    """Höheres Rate-Limit für Premium-Benutzer"""
    scope = 'premium'

    def get_rate(self):
        if self.request.user.is_premium:
            return '10000/hour'
        return '1000/hour'

3. Benutzerdefinierte Berechtigungen

from rest_framework.permissions import BasePermission

class IsOwnerOrReadOnly(BasePermission):
    """Erlaubt Bearbeitung nur dem Eigentümer"""

    def has_object_permission(self, request, view, obj):
        # Lesen für alle erlaubt
        if request.method in ['GET', 'HEAD', 'OPTIONS']:
            return True
        # Schreiben nur für Eigentümer
        return obj.author == request.user

class IsAdminOrReadOnly(BasePermission):
    """Nur Admins können bearbeiten"""

    def has_permission(self, request, view):
        if request.method in ['GET', 'HEAD', 'OPTIONS']:
            return True
        return request.user and request.user.is_staff

4. Fortgeschrittene Serializers

from rest_framework import serializers

class BlogPostSerializer(serializers.ModelSerializer):
    author = serializers.SerializerMethodField()
    reading_time = serializers.ReadOnlyField()

    class Meta:
        model = BlogPost
        fields = ['id', 'title', 'content', 'author', 'reading_time', 'created_at']

    def get_author(self, obj):
        return {
            'id': obj.author.id,
            'username': obj.author.username,
            'email': obj.author.email
        }

    def validate_title(self, value):
        if len(value) < 10:
            raise serializers.ValidationError("Titel zu kurz")
        return value

5. ViewSet mit Custom Actions

from rest_framework.decorators import action
from rest_framework.response import Response

class BlogPostViewSet(viewsets.ModelViewSet):
    queryset = BlogPost.objects.all()
    serializer_class = BlogPostSerializer
    permission_classes = [IsOwnerOrReadOnly]
    throttle_classes = [UserRateThrottle]

    @action(detail=True, methods=['post'])
    def publish(self, request, pk=None):
        """Veröffentlicht einen Artikel"""
        post = self.get_object()
        post.status = 'published'
        post.published_at = timezone.now()
        post.save()
        return Response({'status': 'published'})

    @action(detail=False, methods=['get'])
    def popular(self, request):
        """Gibt die beliebtesten Artikel zurück"""
        popular = self.queryset.order_by('-views')[:10]
        serializer = self.get_serializer(popular, many=True)
        return Response(serializer.data)

Best Practices

  • Verwenden Sie immer HTTPS in der Produktion
  • Implementieren Sie angemessenes Rate-Limiting
  • Validieren Sie alle Eingaben mit Serializers
  • Verwenden Sie granulare Berechtigungen für jeden Endpunkt
  • Protokollieren Sie alle API-Anfragen für Debugging

Fazit

Mit JWT, Throttling und benutzerdefinierten Berechtigungen sind Ihre Django-APIs sicher, skalierbar und produktionsbereit.

Teilen Sie diesen Artikel

Kunden

Noch keine Kommentare. Seien Sie der Erste!

Einen Kommentar hinterlassen

Wird nicht veröffentlicht

Verwandte Artikel

Projekt im Kopf?

Wir entwickeln maßgeschneiderte Software und KI-Lösungen. Lassen Sie uns gemeinsam Ihr nächstes Projekt starten.

Kostenloses Erstgespräch