Django Rest Framework (DRF) 是一个用于构建 RESTful API 的强大框架。在这篇教程中,我们将探讨如何使用DRF来构建一个简单的API。
1.安装RestFramework
- 首先,确保你已经安装了Django和DRF。你可以使用以下命令进行安装:
pip install django
pip install djangorestframework
安装好后,我们创建一个bbs应用。
python manage.py startapp bbs
2.序列化模型
序列化器允许把像查询集和模型实例这样的复杂数据转换为可以轻松渲染成JSON,XML或其他内容类型的原生Python类型。序列化器还提供反序列化,在验证传入的数据之后允许解析数据转换回复杂类型。
REST framework
中的 serializers
与 Django
的Form
和ModelForm
类非常像。restframework
提供了一个Serializer
类,它为你提供了强大的通用方法来控制响应的输出,以及一个ModelSerializer
类,它为创建用于处理模型实例和查询集的序列化程序提供了有用的快捷实现方式。
在bbs目录下,打开models.py文件,并定义一个简单的模型,例如:
from django.db import models
from django.utils import timezone
# Create your models here.
class Post(models.Model):
title = models.CharField(max_length=200, verbose_name='标题')
content = models.TextField(verbose_name='内容')
pub_date = models.DateTimeField(auto_now_add=True, verbose_name='发布日期')
# 模型数据验证
def pub_date_valid(self):
return self.pub_date < timezone.now()
另外,我们在 bbs 目录下,再创建一个新的文件 serializers.py
,并添加以下代码:
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = '__all__'
这里我们定义了一个PostSerializer
,它继承自 DRF
的ModelSerializer
类,并指定了要序列化的模型和字段。
当然你也可以序列化属性,继承自 serializers.Serializer
, 类似于:
class PostSerializer(serializers.Serializer):
title = serializers.CharField(max_length=200)
content = serializers.CharField()
pub_date = serializers.DateTimeField()
3.基于函数的视图
from rest_framework.decorators import api_view
@api_view()
def hello_world(request):
return Response({"message": "Hello, world!"})
# 区分 get、 post 方法
@api_view(['GET', 'POST'])
def get_post_hello_world(request):
if request.method == 'POST':
return Response({"message": "Got POST data!", "data": request.data})
return Response({"message": "Hello, world!"})
url.py配置如下:
from .views import hello_world, get_post_hello_world
urlpatterns = [
path('/hello', hello_world),
path('/get_post_hello', get_post_hello_world)
]
4.ModelViewSet视图类
在 bbs 目录下,打开views.py文件,并添加以下代码:
from rest_framework import viewsets
from .models import Post
from .serializers import MyModelSerializer
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
这里我们创建了一个MyModelViewSet
视图集,它继承自DRF的ModelViewSet
类,并指定了模型和序列化器。打开bbs应用中的 urls.py
文件,并添加以下代码:
from django.urls import include, path
from .views import PostViewSet
from rest_framework import routers
router = routers.SimpleRouter()
router.register(r'posts', PostViewSet)
urlpatterns = [
path('/', include(router.urls)),
]
这里我们注册了PostViewSet
视图集,并将其映射到 /posts
路径下。接下来,我们只需访问路径,http://127.0.0.1:8000/bbs/posts/
, 发现报错
不要灰心,我们检查一下 settings.py
文件, 并添加下面的配置:
INSTALLED_APPS = [
'rest_framework',
]
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
]
}
再次访问上述链接地址,非常 Wonderful!
5.总结及扩展使用:
本文中涉及的主要知识点包括,序列化serialize, 资源路由routers, 基于函数的视图api_view,以及基于viewset的ModelViewSet。
上一篇教程:Django基础教程:实现验证码登录登出
routers是一种用于自动化URL路由的工具。它提供了一种简化和标准化URL配置的方式,使开发人员可以轻松地定义API端点,并将它们映射到相应的视图函数或视图集上。如上述例子中的ModelViewSet正是利用了routers的这一特性。
ModelViewSet则是继承自ViewSet,通过继承DRF的ViewSet类或其中的一个子类,我们可以来定义自己的视图类。
ViewSet类提供了一系列的标准操作方法,如list
、retrieve
、create
、update
和destroy
,分别对应于API的list
、detail
、create
、update
和delete
操作。
ViewSet类的主要特点如下:
-
1、自动映射URL: ViewSet类自动将方法映射到URL路径,并将其与视图函数进行关联。例如,list方法会自动映射到
GET /api/endpoint/
,retrieve方法会映射到GET /api/endpoint/{pk}/
,create方法会映射到POST /api/endpoint/
,以此类推。 -
2、支持定制操作: 通过重写ViewSet类的方法,来定制每个操作的行为。例如,可以在list方法中加入自定义的过滤逻辑,来对返回的资源进行过滤。还可以重写序列化器类、查询集等,以满足您的特定需求。
-
3、分离视图逻辑
使用ViewSet,可以将相同功能的视图逻辑组织在一起,使代码更清晰、更易于维护。例如,可以将多个视图函数合并为一个ViewSet类,并将它们放在同一个文件中。
需要注意的是,ViewSet类并不是强制的,仍然可以使用自定义的视图函数来处理API请求。但使用ViewSet类可以提高代码的可读性和可维护性,并在很大程度上减少了代码的重复性。
以上就是本文的全部内容,代码可在我的github上找到。