Django REST framework知识点总结

1. Django REST framework概述

Django REST framework即DRF,是一个基于Django框架的Web应用程序开发工具。它提供了一系列用于处理Web APIs的工具。

1.1 为什么需要Django REST framework?

Django REST framework的主要作用是简化Web API的开发过程,它为我们提供了许多常用功能的封装,例如:

序列化数据

认证权限管理

过滤器、排序、搜索等常用功能

使用Django REST framework可以大大提高Web API的开发效率和代码可维护性,让开发人员能够更加专注于业务场景和业务逻辑的实现。

1.2 安装Django REST framework

安装Django REST framework非常简单,只需要在命令行执行以下语句即可:

pip install djangorestframework

安装成功后,需要在Django项目的settings.py文件中添加以下内容:

INSTALLED_APPS = [

...

'rest_framework',

]

这样就完成了Django REST framework的安装。

2. 序列化数据

序列化是指将对象转换成可以在网络上传输的数据格式的过程,常见的数据格式有JSON、XML等。在Web应用程序中,对象的序列化是非常常见的操作,例如将数据库中的数据序列化成JSON格式返回给客户端。

2.1 概述

Django REST framework提供了一套非常方便的序列化工具,使得我们可以轻松地将模型实例序列化成JSON格式或其他格式的数据。

2.2 实例

下面是一个简单的示例,假设我们需要将一个名为Book的模型序列化成JSON格式:

from rest_framework import serializers

from myapp.models import Book

class BookSerializer(serializers.ModelSerializer):

class Meta:

model = Book

fields = ['id', 'name', 'author', 'publish_date']

上面的代码中,我们通过定义一个BookSerializer来实现对Book模型的序列化,其中fields属性指定了需要序列化的字段。

在视图函数中使用该序列化器:

from rest_framework.decorators import api_view

from rest_framework.response import Response

from myapp.models import Book

from myapp.serializers import BookSerializer

@api_view(['GET'])

def get_book(request, book_id):

book = Book.objects.get(id=book_id)

serializer = BookSerializer(book)

return Response(serializer.data)

在上面的代码中,我们定义了一个名为get_book的视图函数,该函数通过使用Book.objects.get方法获取一个Book实例,并将其传递给BookSerializer进行序列化。最后,我们使用Response对象将序列化后的数据返回给客户端。

这只是一个简单的示例,实际上Django REST framework还提供了许多高级序列化功能,例如嵌套序列化、分组序列化、动态字段等,可以根据实际需要进行使用。

3. 认证和权限管理

3.1 认证

在Web应用程序中,认证是指确定用户是谁的过程。Django REST framework提供了一系列内置的认证方式,例如:

基于Token的认证

基于JWT的认证

基于Session的认证

基于OAuth2的认证

我们可以根据实际需要选择相应的认证方式,进行用户身份验证和权限管理。

3.2 权限管理

在Web应用程序中,权限管理是非常重要的一部分。Django REST framework提供了一系列内置的权限类,例如:

IsAuthenticated:必须经过用户身份验证才能使用

IsAdminUser:必须是管理员才能使用

AllowAny:允许任何人使用

我们可以根据实际需要选择相应的权限类,进行访问控制。

例如,假设我们需要限制某些API只能被认证用户访问,可以使用IsAuthenticated权限类:

from rest_framework.decorators import api_view, permission_classes

from rest_framework.permissions import IsAuthenticated

from rest_framework.response import Response

@api_view(['GET'])

@permission_classes([IsAuthenticated])

def my_view(request):

...

在上面的代码中,我们使用@api_view装饰器指定了视图方法的请求方式,使用@permission_classes装饰器指定了访问此API所需要的权限,这样就完成了对API的访问控制。

4. 过滤器、排序、搜索等常用功能

常用的Web API功能包括过滤器、排序、搜索等,Django REST framework提供了一系列内置的工具,可以轻松地实现这些功能。

4.1 过滤器

过滤器是指对查询结果进行筛选的过程。Django REST framework提供了一系列内置的过滤器类,例如:

FilterSet

BaseFilterBackend

SearchFilter

OrderingFilter

我们可以根据实际需要选择相应的过滤器类,进行查询结果的筛选。

例如,我们可以使用Django REST framework提供的SearchFilter实现基于关键字的查询:

from rest_framework.filters import SearchFilter

class MyViewSet(viewsets.ModelViewSet):

queryset = MyModel.objects.all()

serializer_class = MySerializer

filter_backends = [SearchFilter]

search_fields = ['title']

在上面的代码中,我们在视图集中指定了filter_backends和search_fields,这样就完成了基于关键字的查询功能。

4.2 排序

排序是指对查询结果进行排序的过程。Django REST framework提供了一系列内置的排序类,例如:

OrderingFilter

BaseFilterBackend

我们可以根据实际需要选择相应的排序类,进行查询结果的排序。

例如,我们可以使用Django REST framework提供的OrderingFilter实现基于某个字段的升序或降序查询:

from rest_framework.filters import OrderingFilter

class MyViewSet(viewsets.ModelViewSet):

queryset = MyModel.objects.all()

serializer_class = MySerializer

filter_backends = [OrderingFilter]

ordering_fields = ['created_at']

在上面的代码中,我们在视图集中指定了filter_backends和ordering_fields,这样就完成了基于某个字段的升序或降序查询功能。

4.3 搜索

搜索是指根据关键字进行查询的过程。Django REST framework提供了一系列内置的搜索类,例如:

SearchFilter

BaseFilterBackend

我们可以根据实际需要选择相应的搜索类,进行基于关键字的查询。

例如,我们可以使用Django REST framework提供的SearchFilter实现基于关键字的查询:

from rest_framework.filters import SearchFilter

class MyViewSet(viewsets.ModelViewSet):

queryset = MyModel.objects.all()

serializer_class = MySerializer

filter_backends = [SearchFilter]

search_fields = ['title']

在上面的代码中,我们在视图集中指定了filter_backends和search_fields,这样就完成了基于关键字的查询功能。

5. 总结

本文主要介绍了Django REST framework的几个常用功能点,包括序列化数据、认证和权限管理、过滤器、排序、搜索等。Django REST framework大大简化了Web API的开发过程,提高了代码的可维护性和开发效率,为Web应用程序的开发者提供了非常强大的工具。

后端开发标签