您的位置:

Django REST framework从前端后端分离到SimpleJWT

一、前端后端分离

随着Web应用程序的发展,前端和后端的分离越来越受欢迎。 Django REST framework 提供了各种用于构建可扩展的API的工具和库。 API支持前后端分离,这意味着我们可以使用独立的前端框架,例如Vue.js、React.js或Angular,来实现客户端,同时使用DRF构建虚构化的后端

如果你是一个REST API的后端人员,但对前端开发不是很熟悉,这并不妨碍你使用 Django Rest Framework 进行API构建。一些优秀的JavaScript框架可以帮助你将 Django Rest Framework 构建的API和你的前端应用程序分离开。


from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from myapp.serializers import UserSerializer, GroupSerializer

class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer

class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

二、DRF认证

Django Rest Framework提供了一个优雅的方式来应用认证,使你更愿意使用它来保护你的API。DRF提供了一个可插拔的认证架构,允许你使用session、Token、OAuth1a和OAuth2等不同的认证方案。

这里我们介绍一个轻量级的认证库SimpleJWT,它是构建在JWT(JSON Web Token)之上的库,它可以轻松地用于开发REST APIs,并提供了轻松的设置和安全认证。SimpleJWT不需要特定的用户模型,它可以与任何Django身份验证系统一起使用。


# settings.py
INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework_simplejwt',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

三、序列化和验证

在DRF中,序列化是将Python对象转换为JSON格式的过程,当数据以某种方式从API公开时,你可以使用序列化器来更好地组织,过滤和限制总体数据。同时,DRF还提供了验证器来确保输入数据的正确性。它们共同为DRF提供强大的数据安全机制和易于使用的数据交互方式。


# serializers.py
from rest_framework import serializers
from myapp.models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

    def create(self, validated_data):
        user = User(
            email=validated_data['email'],
            username=validated_data['username'],
            first_name=validated_data['first_name'],
            last_name=validated_data['last_name'],
        )
        user.set_password(validated_data['password'])
        user.save()
        return user

# views.py
from rest_framework import generics
from myapp.models import User
from myapp.serializers import UserSerializer

class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer