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

使用 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.xdnf.cn/news/16472.html

相关文章:

  • vue请求golang后端CORS跨域问题深度踩坑
  • 分布式链路追踪详解
  • 图论:Bellman_ford算法
  • 预过滤环境光贴图制作教程:第三阶段 - GGX 分布预过滤
  • Unity 编辑器开发 之 Excel导表工具
  • git使用lfs解决大文件上传限制
  • 监控场景视频质量异常修复:陌讯动态增强算法实战解析
  • 使用JavaScript实现轮播图的自动切换和左右箭头切换效果
  • BERT 的 NSP慢慢转换为SOP
  • Linux -- 文件【中】
  • 工具链攻击利用漏洞链入侵SharePoint服务器获取完全控制权
  • 图片查重从设计到实现(7) :使用 Milvus 实现高效图片查重功能
  • python基础:request请求Cookie保持登录状态、重定向与历史请求、SSL证书校验、超时和重试失败、自动生成request请求代码和案例实践
  • GCC、glibc、GNU C(gnuc)的关系
  • 准大一GIS专业新生,如何挑选电脑?
  • redhat7.9更换源为centos7(阿里云源-目前centos7可用的源)
  • 基于KMeans、AgglomerativeClustering、DBSCAN、PCA的聚类分析的区域经济差异研究
  • 222. 完全二叉树的节点个数
  • AI算法实现解析-C++实例
  • 如何在在NPM发布一个React组件
  • 第2章 cmd命令基础:常用基础命令(1)
  • 音频算法基础(语音识别 / 降噪 / 分离)
  • Rust:anyhow::Result 与其他 Result 类型转换
  • HTTP 与 HTTPS 的区别
  • 【C++篇】“内存泄露”的宝藏手段:智能指针
  • Neurosciences study notes[1]
  • vue2 使用liveplayer加载视频
  • CVPR 2025 | 华科精测:无需人工标注也能精准识别缺陷类别,AnomalyNCD 实现多类别缺陷自主分类
  • 机器学习、深度学习与数据挖掘:核心技术差异、应用场景与工程实践指南
  • 笔试——Day22