在现代开发中,RESTful API 已经成为了构建分布式系统的标准方式。Django REST framework 是 Django 的一个强大的扩展,提供了方便易用的工具来快速创建高质量的 RESTful API。
本文将介绍如何使用 Django REST framework 创建 RESTful API,包含以下内容:
- 什么是 RESTful API
- Django REST framework 的优势和常用组件
- 如何搭建 Django REST framework 项目
- 如何创建模型和序列化器
- 如何使用视图集和路由
- 如何进行身份验证和权限控制
RESTful API 概述
RESTful API 是一种基于 HTTP 协议,按照一定的约定去设计和组织 API 接口,以提供资源的表现形式,并通过 URI 去访问这些资源。RESTful API 通常使用 JSON 格式进行数据传输,而不是 XML 或 SOAP。它的设计原则包括:
- 每个资源对应一个 URI(Uniform Resource Identifier),即通过 URL 去访问它
- 通过 HTTP Method(GET、POST、PUT、DELETE 等)去操作资源
- 使用标准 HTTP 状态码返回结果
- 返回的数据格式通常是 JSON,同时也支持 XML 和其他格式
Django REST framework 的优势和常用组件
Django REST framework 是 Django 的一个扩展,它为 Django 应用提供了一套方便的工具来构建和管理 RESTful API,具有以下优势:
- 易于学习和理解,具有简单但强大的 API 设计
- 灵活多变,支持多种数据格式、身份验证方式和权限控制
- 提供了丰富的默认组件,如模型序列化器、视图集、路由等
- 可以灵活地自定义组件,以满足特定的业务需求
- 社区活跃,有强大的文档和示例代码支持
Django REST framework 的常用组件包括:
- 版本控制组件:可以对 API 的版本进行管理
- 请求解析器组件:可以解析请求的格式,如 JSON、Form、MultiPart 等
- 序列化器组件:可以将模型数据转换为 JSON、XML 等格式
- 视图组件:提供了多种视图方式,如类视图、函数视图等
- 路由组件:可以动态管理 API 的 URL,方便扩展和重构
- 身份验证组件:可以对用户进行身份验证,如基于 Token 的身份验证
- 权限控制组件:可以精细地控制用户的权限,比如只允许管理员进行操作
搭建 Django REST Framework 项目
在开始之前,请确保你已经安装了 Django 和 Django REST framework,可以通过以下命令进行安装:
pip install django
pip install djangorestframework
接下来,我们可以使用如下命令创建一个 Django 项目:
django-admin startproject myproject
然后创建一个 Django 应用:
python manage.py startapp myapp
在 settings.py 文件中添加配置:
-- -------------------- ---- ------- -------------- - - ----------------------- ---------------------- ------------------------------ -------------------------- -------------------------- ----------------------------- ----------------- - ---- -------- - ---- -展开代码
在 urls.py 文件中添加路由配置:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('myapp.urls')), # 添加此行 ]
创建模型和序列化器
在创建 RESTful API 之前,我们需要先定义数据模型和序列化器。模型定义了数据的结构,序列化器则负责将模型数据转换为 JSON 格式。
下面是一个简单的模型定义,用于保存博客文章的信息:
from django.db import models class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True)
我们可以使用 Django REST framework 的 ModelSerializer 类来定义一个序列化器:
from rest_framework import serializers from myapp.models import Post class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = ('id', 'title', 'content', 'created_at', 'updated_at')
使用视图集和路由
在 Django REST framework 中,视图集(Viewset)是一种特殊的视图,用于处理 RESTful API 中的 CRUD(Create、Read、Update、Delete)操作,可以统一管理相同资源的多种操作。例如,在上面的例子中,我们希望创建一个资源管理器,对文章进行增删改查操作,可以使用如下代码:
from rest_framework import viewsets from myapp.models import Post from myapp.serializers import PostSerializer class PostViewSet(viewsets.ModelViewSet): queryset = Post.objects.all() serializer_class = PostSerializer
这里我们定义了一个名为 PostViewSet 的视图集,它继承自 viewsets.ModelViewSet 类,并指定了模型和序列化器。
然后我们需要定义一个路由,将 URL 映射到视图集上:
-- -------------------- ---- ------- ---- ----------- ------ ----- ------- ---- ---------------------- ------ ------------- ---- ----------- ------ ----------- ------ - --------------- ------------------------ ------------ ----------- - - -------- ---------------------- -展开代码
这里我们使用了 Django REST framework 的 DefaultRouter 类,自动生成了访问文章资源的路由。要点解这个 register 方法中的第一个参数是 ‘posts’,这个字符串指定了 URL 的前缀,即访问文章资源时需要在 URL 中添加此前缀。router.urls 会自动生成 URL 集合,我们直接使用 include 函数将其包含在 urlpatterns 中即可。
身份验证和权限控制
在实际项目中,我们可能需要对用户进行身份验证和权限控制,以确保 API 的安全性。
Django REST framework 为身份验证和权限控制提供了许多默认的组件,我们可以使用这些组件来增强 API 的安全性。
以下是一个示例,使用基于 Token 的身份验证和基于角色的权限控制:
-- -------------------- ---- ------- ---- ----------------------------- ------ ------------------- ---- -------------------------- ------ ---------------- ----------- ---- ------------------------- ------ ------ ----- ----------------------------------- -------- - ------------------ ---------------- - -------------- ---------------------- - ---------------------- - ---- ------------------ - ----------------- ------------ - ---- --------------------- ---------------- -------------------- --- -------------- --------- ----- - ---------------------------------------- ---------- - -------------------------- ---------- ------ -------------------------展开代码
在上面的代码中,我们使用了 authentication_classes 和 permission_classes 来指定身份验证方式和权限控制。在这个例子中,我们使用了基于 Token 的身份验证,并使用了 IsAuthenticated 和 IsAdminUser 来控制只有管理员才能进行操作。
我们还定义了一个 action,用于获取当前用户的文章列表。首先我们过滤出当前用户的文章,然后将其传入序列化器,最后返回 JSON 格式的数据。
结语
通过本文的学习,你应该已经掌握了使用 Django REST framework 创建 RESTful API 的基本流程和技术要点。你可以进一步深入学习 Django REST framework 的其他组件,以满足实际项目的需求。
示例代码:
models.py
-- -------------------- ---- ------- ---- --------- ------ ------ ----- ------------------- ----- - -------------------------------- ------- - ------------------ ------ - ------------------------------ --------------------- ------------------------- ---------- - --------------------------------------- ---------- - ----------------------------------- --- -------------- ------ ----------展开代码
serializers.py
from rest_framework import serializers from myapp.models import Post class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = ('id', 'title', 'content', 'author', 'created_at', 'updated_at')
views.py
-- -------------------- ---- ------- ---- -------------- ------ --------- ----------- ---- ------------------------- ------ ------ ---- ----------------------- ------ -------- ---- ------------ ------ ---- ---- ----------------- ------ -------------- ----- ----------------------------------- -------- - ------------------ ---------------- - -------------- ------------------ - --------------------------------------- - --- -------------------- ------------ ----------------------------------------- --------------------- ---------------- -------------------- --- -------------- --------- ----- - ---------------------------------------- ---------- - -------------------------- ---------- ------ -------------------------展开代码
urls.py
-- -------------------- ---- ------- ---- ----------- ------ ----- ------- ---- ---------------------- ------ ------------- ---- ----------- ------ ----------- ------ - --------------- ------------------------ ------------ ----------- - - -------- ---------------------- -展开代码
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6791ffc7504e4ea9bd5d32a2