news 2026/6/17 0:11:06

从零到一:Python开发者如何用Django REST Framework打造企业级API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零到一:Python开发者如何用Django REST Framework打造企业级API

从零到一:Python开发者如何用Django REST Framework打造企业级API

【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days

想象一下这个场景:你刚加入一家创业公司,老板说"我们需要一个API让移动端App能访问用户数据",而你只有Python和Django的基础知识。别慌!今天我就带你用Django REST Framework(DRF)这个神器,从零开始构建一个完整的企业级REST API。

为什么你的项目需要REST API?

我们先来看看传统Web开发和API开发的对比:

传统Web开发API开发
服务器渲染HTML页面服务器返回JSON数据
前后端代码混合前后端完全分离
一个团队全包前端、移动端、后端团队分工协作
难以支持多平台一套API支持Web、iOS、Android

现在你知道为什么大厂都在用API了吧?它让开发效率提升至少30%!

实战:从"Hello API"到用户管理系统

第一步:搭建你的API游乐场

先创建一个Django项目,然后安装DRF:

# 创建项目 django-admin startproject api_project cd api_project # 创建用户管理应用 python manage.py startapp users # 安装DRF pip install djangorestframework

修改settings.py,让DRF加入你的项目:

# settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', # 添加这一行 'users', # 你的应用 ] # DRF配置 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticatedOrReadOnly', ], 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 10 }

第二步:创建你的第一个API端点

让我们从最简单的"Hello API"开始。在users/views.py中:

from rest_framework.decorators import api_view from rest_framework.response import Response @api_view(['GET']) def hello_api(request): """最简单的API端点""" return Response({ 'message': '欢迎来到API世界!', 'status': 'success', 'timestamp': timezone.now() })

现在在urls.py中添加路由:

from django.urls import path from users.views import hello_api urlpatterns = [ path('api/hello/', hello_api, name='hello-api'), ]

启动服务器,访问http://localhost:8000/api/hello/,你会看到:

{ "message": "欢迎来到API世界!", "status": "success", "timestamp": "2024-01-01T10:00:00Z" }

恭喜!你的第一个API已经上线了。

进阶:构建完整的用户管理API

模型设计:不只是User模型

users/models.py中,我们创建一个增强的用户模型:

from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): """自定义用户模型""" phone = models.CharField(max_length=15, blank=True, null=True) avatar = models.ImageField(upload_to='avatars/', blank=True, null=True) bio = models.TextField(blank=True, null=True) is_verified = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = 'custom_users' verbose_name = '用户' verbose_name_plural = '用户管理' def __str__(self): return f"{self.username} ({self.email})"

序列化器:数据的变形金刚

序列化器是DRF的核心,它把数据库对象变成JSON,也能把JSON变回数据库对象。在users/serializers.py中:

from rest_framework import serializers from django.contrib.auth.hashers import make_password from .models import CustomUser class UserSerializer(serializers.ModelSerializer): """用户序列化器""" password = serializers.CharField(write_only=True) # 密码只写不读 confirm_password = serializers.CharField(write_only=True) # 确认密码 class Meta: model = CustomUser fields = ['id', 'username', 'email', 'phone', 'password', 'confirm_password', 'bio', 'is_verified', 'created_at'] def validate(self, data): """验证数据""" if data['password'] != data['confirm_password']: raise serializers.ValidationError("两次输入的密码不一致") return data def create(self, validated_data): """创建用户时加密密码""" validated_data.pop('confirm_password') # 移除确认密码字段 validated_data['password'] = make_password(validated_data['password']) return super().create(validated_data) def update(self, instance, validated_data): """更新用户信息""" if 'password' in validated_data: validated_data['password'] = make_password(validated_data['password']) return super().update(instance, validated_data)

视图集:一行代码搞定CRUD

DRF最强大的功能之一就是ViewSet,它能用极少的代码实现完整的CRUD操作:

from rest_framework import viewsets, permissions, filters from rest_framework.decorators import action from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend from .models import CustomUser from .serializers import UserSerializer class UserViewSet(viewsets.ModelViewSet): """用户视图集""" queryset = CustomUser.objects.all() serializer_class = UserSerializer permission_classes = [permissions.IsAuthenticated] filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter] filterset_fields = ['is_verified', 'is_active'] search_fields = ['username', 'email', 'phone'] ordering_fields = ['created_at', 'username'] @action(detail=False, methods=['get']) def me(self, request): """获取当前用户信息""" serializer = self.get_serializer(request.user) return Response(serializer.data) @action(detail=False, methods=['post']) def register(self, request): """用户注册""" serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.save() return Response({ 'user_id': user.id, 'message': '注册成功', 'token': user.auth_token.key if hasattr(user, 'auth_token') else None }, status=201) @action(detail=True, methods=['post']) def change_password(self, request, pk=None): """修改密码""" user = self.get_object() old_password = request.data.get('old_password') new_password = request.data.get('new_password') if not user.check_password(old_password): return Response({'error': '原密码错误'}, status=400) user.set_password(new_password) user.save() return Response({'message': '密码修改成功'})

DRF的可视化调试界面

DRF最酷的功能之一就是它自带的API调试界面。当你访问API端点时,它会自动生成一个漂亮的Web界面:

这个界面不仅展示了API的响应数据,还提供了:

  • 实时测试API的功能
  • 查看请求/响应头信息
  • 在线填写表单提交数据
  • 查看API文档

认证与安全:保护你的API

JWT认证:无状态的安全卫士

在分布式系统中,JWT(JSON Web Token)是最流行的认证方式。让我们看看它的结构:

JWT由三部分组成:

  1. Header:算法和令牌类型
  2. Payload:用户信息和权限声明
  3. Signature:签名验证完整性

安装JWT支持:

pip install djangorestframework-simplejwt

配置JWT认证:

# settings.py REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], } # JWT配置 from datetime import timedelta SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(hours=1), 'REFRESH_TOKEN_LIFETIME': timedelta(days=7), 'ROTATE_REFRESH_TOKENS': True, 'BLACKLIST_AFTER_ROTATION': True, }

权限控制:谁可以做什么

DRF提供了灵活的权限系统:

from rest_framework import permissions class IsOwnerOrReadOnly(permissions.BasePermission): """自定义权限:只有所有者可以编辑""" def has_object_permission(self, request, view, obj): # 读取权限允许任何请求 if request.method in permissions.SAFE_METHODS: return True # 写入权限只允许对象的所有者 return obj.owner == request.user class IsAdminOrReadOnly(permissions.BasePermission): """管理员可以编辑,其他人只能读取""" def has_permission(self, request, view): if request.method in permissions.SAFE_METHODS: return True return request.user and request.user.is_staff

高级技巧:让你的API更强大

1. 分页:处理大量数据

from rest_framework.pagination import PageNumberPagination class CustomPagination(PageNumberPagination): page_size = 20 page_size_query_param = 'page_size' max_page_size = 100 def get_paginated_response(self, data): return Response({ 'links': { 'next': self.get_next_link(), 'previous': self.get_previous_link() }, 'count': self.page.paginator.count, 'total_pages': self.page.paginator.num_pages, 'current_page': self.page.number, 'results': data })

2. 缓存:提升性能

from django.utils.decorators import method_decorator from django.views.decorators.cache import cache_page from django.views.decorators.vary import vary_on_cookie class CachedUserViewSet(viewsets.ModelViewSet): """带缓存的用户视图集""" queryset = CustomUser.objects.all() serializer_class = UserSerializer @method_decorator(cache_page(60 * 15)) # 缓存15分钟 @method_decorator(vary_on_cookie) def list(self, request, *args, **kwargs): return super().list(request, *args, **kwargs)

3. 限流:防止API被滥用

REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.AnonRateThrottle', # 匿名用户 'rest_framework.throttling.UserRateThrottle', # 认证用户 ], 'DEFAULT_THROTTLE_RATES': { 'anon': '100/day', # 匿名用户每天100次 'user': '1000/day', # 认证用户每天1000次 'burst': '60/minute', # 突发请求限制 } }

常见问题与解决方案

问题1:跨域请求被阻止

解决方案:安装django-cors-headers

pip install django-cors-headers

配置:

# settings.py INSTALLED_APPS = [ 'corsheaders', ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', ] CORS_ALLOWED_ORIGINS = [ "http://localhost:3000", # React开发服务器 "http://127.0.0.1:3000", ]

问题2:API响应慢

优化建议:

  1. 使用select_relatedprefetch_related减少数据库查询
  2. 添加适当的索引
  3. 使用缓存
  4. 启用Gzip压缩
# 优化查询示例 class OptimizedUserViewSet(viewsets.ModelViewSet): def get_queryset(self): return CustomUser.objects.select_related('profile').prefetch_related('groups')

问题3:API文档不完整

使用DRF的自动文档生成:

from rest_framework.documentation import include_docs_urls urlpatterns = [ path('docs/', include_docs_urls(title='API文档')), ]

实战项目:构建一个博客API

让我们把所有知识整合起来,构建一个完整的博客API:

# blog/models.py class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() author = models.ForeignKey(CustomUser, on_delete=models.CASCADE) tags = models.ManyToManyField('Tag') published = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) # blog/serializers.py class PostSerializer(serializers.ModelSerializer): author = UserSerializer(read_only=True) tags = TagSerializer(many=True, read_only=True) class Meta: model = Post fields = '__all__' read_only_fields = ['author', 'created_at', 'updated_at'] # blog/views.py class PostViewSet(viewsets.ModelViewSet): queryset = Post.objects.filter(published=True) serializer_class = PostSerializer permission_classes = [permissions.IsAuthenticatedOrReadOnly] def perform_create(self, serializer): serializer.save(author=self.request.user)

总结:API开发的思维导图

RESTful API开发全流程 ├── 设计阶段 │ ├── 确定资源(URI设计) │ ├── 定义HTTP方法 │ ├── 设计请求/响应格式 │ └── 规划认证授权 ├── 实现阶段 │ ├── 安装配置DRF │ ├── 创建模型和序列化器 │ ├── 编写视图和路由 │ ├── 实现认证授权 │ └── 添加分页过滤 ├── 优化阶段 │ ├── 性能优化(缓存、索引) │ ├── 安全加固(限流、验证) │ ├── 文档生成 │ └── 测试覆盖 └── 部署阶段 ├── 环境配置 ├── 监控告警 ├── 日志分析 └── 版本管理

下一步学习路径

掌握了DRF基础后,你可以继续深入学习:

  1. API版本管理- 如何优雅地升级API而不破坏现有客户端
  2. GraphQL vs REST- 什么时候该用GraphQL
  3. API网关- 大型系统的API治理
  4. 微服务架构- 将API拆分成独立的微服务
  5. 性能监控- 使用APM工具监控API性能

记住,好的API设计就像好的产品设计:简单、直观、稳定。DRF提供了强大的工具,但真正优秀的API设计需要你对业务有深刻理解。现在,去创建你的第一个API吧!

提示:本文基于Python-100-Days项目中的Day46-60内容,更多实战案例和进阶技巧可以在项目的相关章节中找到。

【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 0:02:16

GPT-4驱动的Python地理可视化四库实战指南

1. 项目概述:当大模型遇上地理信息,四款Python地图库的实战筛选你有没有试过让GPT-4直接画一张带标注的行政区划图?我试过——它能用ASCII字符拼出个“中国轮廓”,也能在Markdown里用emoji堆个“北京→上海→广州”的箭头链&#…

作者头像 李华
网站建设 2026/6/17 0:01:32

QorIQ处理器Hypervisor下Qman/SEC/PME设备树配置详解与性能优化

1. 项目概述与核心价值在基于Freescale(现NXP)QorIQ系列处理器的嵌入式系统开发中,尤其是涉及网络加速、安全处理等高性能场景时,Qman(Queue Manager)、**SEC(Security Engine)和PME…

作者头像 李华
网站建设 2026/6/16 23:58:45

司法过程摩擦力:用工程思维测量法律系统的运行损耗

1. 项目概述:这不是一本“笔记”,而是一套可复用的法律认知操作系统“imjustice”这个词本身不是标准英文单词,而是“injustice”(不公正)的刻意变形拼写——去掉前缀“in-”中的“n”,留下一个带刺的、未完…

作者头像 李华
网站建设 2026/6/16 23:58:03

S32K汽车MCU:ARM Cortex-M架构如何重塑汽车软件开发模式

1. 项目概述:为什么S32K是“软件工程师的MCU”?在汽车电子行业摸爬滚打了十几年,我亲眼见证了汽车从“机械为主、电子为辅”到“软件定义汽车”的深刻变革。早期的项目,我们往往是在为一颗特定的8位或16位MCU“量身定制”软件&…

作者头像 李华