一、前端后端分离
随着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