当前位置: 首页 > news >正文

使用 Django REST Framework 构建强大的 API

在当今的 Web 开发中,构建 RESTful API 已经成为连接前后端不可或缺的一环。Django REST Framework(DRF)是一个强大而灵活的工具包,用于构建 Web APIs。它基于 Django 框架之上,提供了简单且可扩展的方式,让开发者能够快速地创建出功能丰富的 API。

本文将带你从零开始,使用 Django REST Framework 创建一个简单的博客应用 API,涵盖模型设计、序列化器、视图集、路由配置以及权限管理等内容。


一、安装与配置 Django REST Framework

首先确保你已经安装了 Django 并创建了一个项目。接下来我们来安装 DRF:

pip install djangorestframework

然后,在你的 settings.py 文件中的 INSTALLED_APPS 列表里添加 'rest_framework'

INSTALLED_APPS = [...'rest_framework',
]

二、创建博客应用

假设你已经有了一个名为 blog 的应用,我们将在此基础上构建我们的 API。

1. 定义模型

models.py 中定义文章和作者的模型:

from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)def __str__(self):return self.nameclass Post(models.Model):title = models.CharField(max_length=200)content = models.TextField()author = models.ForeignKey(Author, on_delete=models.CASCADE)published_date = models.DateTimeField(auto_now_add=True)def __str__(self):return self.title

运行迁移命令以创建数据库表:

python manage.py makemigrations
python manage.py migrate

三、序列化数据

为了将 Django 模型转换为 JSON 格式,我们需要使用 DRF 提供的序列化器。

1. 创建序列化器

blog 应用下新建一个 serializers.py 文件,并定义如下内容:

from rest_framework import serializers
from .models import Post, Authorclass AuthorSerializer(serializers.ModelSerializer):class Meta:model = Authorfields = ['id', 'name']class PostSerializer(serializers.ModelSerializer):author = AuthorSerializer()class Meta:model = Postfields = ['id', 'title', 'content', 'author', 'published_date']

这里我们定义了两个序列化器:一个是针对 Author 模型的 AuthorSerializer,另一个是针对 Post 模型的 PostSerializer,其中包含了对 Author 的嵌套序列化。


四、编写视图

DRF 提供了两种主要的方式来定义视图:基于函数的视图和基于类的视图。在这里,我们将使用视图集(ViewSets),这是一种更加简洁和强大的方式。

1. 创建视图集

views.py 中添加以下代码:

from rest_framework import viewsets
from .models import Post, Author
from .serializers import PostSerializer, AuthorSerializerclass AuthorViewSet(viewsets.ModelViewSet):queryset = Author.objects.all()serializer_class = AuthorSerializerclass PostViewSet(viewsets.ModelViewSet):queryset = Post.objects.all()serializer_class = PostSerializer

五、配置 URL 路由

为了让 API 可访问,我们需要设置相应的路由。

urls.py 中进行如下修改:

from django.urls import include, path
from rest_framework.routers import DefaultRouter
from blog.views import AuthorViewSet, PostViewSetrouter = DefaultRouter()
router.register(r'authors', AuthorViewSet)
router.register(r'posts', PostViewSet)urlpatterns = [path('', include(router.urls)),
]

这样我们就设置了两个基本的路由 /authors//posts/,分别对应作者和文章的操作。


六、测试 API

启动 Django 开发服务器:

python manage.py runserver

现在你可以通过浏览器或 POSTMAN 等工具访问 API 接口了。例如:

  • 获取所有文章列表:GET http://localhost:8000/posts/
  • 创建新文章:POST http://localhost:8000/posts/
  • 更新一篇文章:PUT http://localhost:8000/posts/{id}/
  • 删除一篇文章:DELETE http://localhost:8000/posts/{id}/

七、添加认证和权限

对于大多数 API 来说,控制谁可以访问特定资源是非常重要的。DRF 提供了多种认证方式和权限策略。

1. 配置全局认证

settings.py 中添加:

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

这将启用基本的身份验证和会话身份验证,并要求所有用户必须已登录才能访问 API。

2. 自定义权限

如果你想对不同的视图设置不同的权限,可以在对应的视图集中指定 permission_classes 属性。

from rest_framework.permissions import IsAdminUserclass PostViewSet(viewsets.ModelViewSet):...permission_classes = [IsAdminUser]  # 只有管理员可以编辑帖子

八、总结

通过本教程,你应该已经学会了如何使用 Django REST Framework 快速搭建一个 RESTful API。我们覆盖了从环境准备、模型定义、序列化器编写、视图集实现到路由配置的基础知识,并介绍了如何添加认证和权限保护。

当然,DRF 还有许多高级特性等待你去探索,如分页、过滤、自定义动作等。希望这篇文章能帮助你在开发过程中更好地理解和运用这些概念。


参考资料

Home - Django REST framework

Quickstart - Django REST framework

Viewsets - Django REST framework

Authentication - Django REST framework

http://www.lryc.cn/news/603439.html

相关文章:

  • CVE-2022-46169漏洞复现
  • Mysql Connect -- 详解
  • Ollama安装及使用Ollama部署大模型
  • 51c大模型~合集161
  • 【高级深度学习框架】lightning的使用记录
  • 番茄项目2:阶段性目标——用纯python完成这个项目
  • Vue3 状态管理新选择:Pinia 从入门到实战
  • 【JavaScript】手写 Object.prototype.toString()
  • 利用对称算法及非对称算法实现安全启动
  • C++异常捕获:为何推荐按引用(by reference)捕获?
  • 机器学习 线性回归算法及案例实现
  • Generative AI in Game Development
  • 信号上升沿时间与频谱分量的关系
  • 多线程--关于锁的一些知识考点
  • NumPy 2.x 完全指南【三十】整数数组索引
  • 5.1 动⼿实现⼀个 LLaMA2 ⼤模型
  • Effective C++ 条款10:令operator=返回一个reference to *this
  • 【Java面试题】面向对象
  • Kubernetes 高级调度 01
  • 实现多路标注截图
  • WMS仓储管理系统在不良品管理中的优化策略
  • OpenCL - study - code04 canny
  • C++基础:模拟实现priority_queue(堆),详细介绍仿函数
  • Python 程序设计讲义(29):字符串的处理方法——大小写转换
  • 网络数据传输与NAT技术的工作原理
  • 计算机网络五层模型
  • 【微信小程序】12、生物认证能力
  • .gitignore 添加 vue.config.js 时不好使
  • 微信小程序无法构建npm,可能是如下几个原因
  • Excel批量加密工具,一键保护多个文件