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

Python Django REST Framework实战:构建RESTful API

Python Django REST Framework实战构建RESTful API引言在Python Web开发中Django REST FrameworkDRF是构建RESTful API的首选框架。作为一名从Rust转向Python的后端开发者我深刻体会到DRF在快速构建高质量API方面的优势。DRF提供了强大的序列化器、视图和认证系统使得API开发变得更加高效。DRF核心概念什么是Django REST FrameworkDjango REST Framework是基于Django的RESTful API框架具有以下特点序列化器将模型数据转换为JSON格式视图集提供CRUD操作的统一接口认证系统支持多种认证方式权限控制细粒度的权限管理分页支持内置分页功能架构设计┌─────────────────────────────────────────────────────────────┐ │ DRF 架构层次 │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ 路由层 │───▶│ 视图层 │───▶│ 序列化层 │ │ │ │ (URL Router) │ │ (ViewSet) │ │ (Serializer) │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 数据层 (Model) │ │ │ └──────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘环境搭建与基础配置安装依赖pip install django djangorestframework项目配置# settings.py INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, rest_framework, myapp, ] REST_FRAMEWORK { DEFAULT_AUTHENTICATION_CLASSES: [ rest_framework.authentication.BasicAuthentication, rest_framework.authentication.SessionAuthentication, ], DEFAULT_PERMISSION_CLASSES: [ rest_framework.permissions.IsAuthenticated, ], }序列化器实战基本序列化器from rest_framework import serializers from .models import User class UserSerializer(serializers.ModelSerializer): class Meta: model User fields [id, username, email, is_active] class UserCreateSerializer(serializers.ModelSerializer): password serializers.CharField(write_onlyTrue) class Meta: model User fields [username, email, password] def create(self, validated_data): user User.objects.create_user( usernamevalidated_data[username], emailvalidated_data[email], passwordvalidated_data[password] ) return user嵌套序列化器from rest_framework import serializers from .models import Post, Comment class CommentSerializer(serializers.ModelSerializer): class Meta: model Comment fields [id, content, created_at] class PostSerializer(serializers.ModelSerializer): comments CommentSerializer(manyTrue, read_onlyTrue) author_name serializers.CharField(sourceauthor.username, read_onlyTrue) class Meta: model Post fields [id, title, content, author_name, comments, created_at]视图集实战基本视图集from rest_framework import viewsets from .models import User from .serializers import UserSerializer class UserViewSet(viewsets.ModelViewSet): queryset User.objects.all() serializer_class UserSerializer def get_queryset(self): queryset super().get_queryset() username self.request.query_params.get(username) if username: queryset queryset.filter(username__icontainsusername) return queryset自定义视图集from rest_framework import viewsets, status from rest_framework.response import Response from .models import Post from .serializers import PostSerializer class PostViewSet(viewsets.ViewSet): def list(self, request): posts Post.objects.all() serializer PostSerializer(posts, manyTrue) return Response(serializer.data) def retrieve(self, request, pkNone): post Post.objects.get(pkpk) serializer PostSerializer(post) return Response(serializer.data) def create(self, request): serializer PostSerializer(datarequest.data) if serializer.is_valid(): serializer.save(authorrequest.user) return Response(serializer.data, statusstatus.HTTP_201_CREATED) return Response(serializer.errors, statusstatus.HTTP_400_BAD_REQUEST)路由配置from django.urls import path, include from rest_framework.routers import DefaultRouter from .views import UserViewSet, PostViewSet router DefaultRouter() router.register(rusers, UserViewSet) router.register(rposts, PostViewSet) urlpatterns [ path(api/, include(router.urls)), ]认证与权限Token认证# settings.py REST_FRAMEWORK { DEFAULT_AUTHENTICATION_CLASSES: [ rest_framework.authentication.TokenAuthentication, ], } # urls.py from rest_framework.authtoken.views import obtain_auth_token urlpatterns [ path(api-token-auth/, obtain_auth_token), ]自定义权限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.author request.user实际业务场景场景一博客APIfrom rest_framework import viewsets, permissions from .models import Post, Comment from .serializers import PostSerializer, CommentSerializer class PostViewSet(viewsets.ModelViewSet): queryset Post.objects.all() serializer_class PostSerializer permission_classes [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly] def perform_create(self, serializer): serializer.save(authorself.request.user) class CommentViewSet(viewsets.ModelViewSet): queryset Comment.objects.all() serializer_class CommentSerializer def get_queryset(self): post_id self.request.query_params.get(post_id) if post_id: return self.queryset.filter(post_idpost_id) return self.queryset场景二分页配置from rest_framework.pagination import PageNumberPagination class CustomPagination(PageNumberPagination): page_size 10 page_size_query_param page_size max_page_size 100 class UserViewSet(viewsets.ModelViewSet): queryset User.objects.all() serializer_class UserSerializer pagination_class CustomPagination性能优化查询优化class PostViewSet(viewsets.ModelViewSet): queryset Post.objects.select_related(author).prefetch_related(comments).all() serializer_class PostSerializer缓存from django.core.cache import cache from rest_framework.decorators import api_view from rest_framework.response import Response api_view([GET]) def get_stats(request): cache_key api_stats stats cache.get(cache_key) if not stats: stats calculate_stats() cache.set(cache_key, stats, 60 * 5) return Response(stats)总结Django REST Framework为Python后端开发者提供了强大的API开发能力。通过序列化器、视图集和认证系统可以快速构建高质量的RESTful API。从Rust开发者的角度来看DRF的声明式API设计与Rust的类型安全理念有相似之处。在实际项目中建议合理使用视图集和序列化器来提高开发效率并注意查询优化和缓存来提升性能。

相关文章:

Python Django REST Framework实战:构建RESTful API

Python Django REST Framework实战:构建RESTful API 引言 在Python Web开发中,Django REST Framework(DRF)是构建RESTful API的首选框架。作为一名从Rust转向Python的后端开发者,我深刻体会到DRF在快速构建高质量API方…...

上位机知识篇---提高Linux下载速度

提升 wget、pip 和 conda 的下载速度,核心方法可以归结为两类:一是使用更快的下载工具,二是连接到更近的镜像站点。下面的表格总结了几种主流的加速方案,方便你快速查阅:提速方法wgetpipconda🚀 换用更快的…...

观察使用Taotoken Token Plan后月度API成本的变化趋势

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察使用Taotoken Token Plan后月度API成本的变化趋势 对于依赖大模型API进行开发的中小型团队而言,月度API成本的可预…...

供水泵恒压变频控制系统:备用泵自动投切,保障供水不间断

供水泵恒压变频控制系统是一套融合变频调速、PID闭环控制与智能多泵管理的自动化节能供水解决方案,核心是按需供水、稳压节能、无人值守。 一、核心原理压力采集:管网压力传感器实时采集水压(0~1.6MPa)。偏差计算:PLC/专用控制器将实测值与设…...

终极窗口尺寸调整工具:WindowResizer完整使用指南

终极窗口尺寸调整工具:WindowResizer完整使用指南 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽大小的顽固应用程序窗口而烦恼吗?Wind…...

Nrfr终极指南:5步轻松修改SIM卡国家码,免Root突破区域限制

Nrfr终极指南:5步轻松修改SIM卡国家码,免Root突破区域限制 【免费下载链接】Nrfr 🌍 免 Root 的 SIM 卡国家码修改工具 | 解决国际漫游时的兼容性问题,帮助使用海外 SIM 卡获得更好的本地化体验,解锁运营商限制&#x…...

为什么需要图像篡改检测?5个简单步骤守护数字世界的真实性

为什么需要图像篡改检测?5个简单步骤守护数字世界的真实性 【免费下载链接】image_tampering_detection_references A list of papers, codes and other interesting collections pertaining to image tampering detection and localization. 项目地址: https://g…...

别再只会轮询了!STM32CubeMX配置USART中断,从原理到调试一条龙指南

STM32串口中断实战:从轮询到事件驱动的效率跃迁 在嵌入式开发中,串口通信就像系统的神经末梢,负责与外界交换关键信息。传统轮询方式如同不断拨打电话确认消息,而中断机制则像设置来电提醒——只有当数据真正到达时才会唤醒CPU。这…...

ETS2LA:让《欧洲卡车模拟2》自动驾驶的终极解决方案

ETS2LA:让《欧洲卡车模拟2》自动驾驶的终极解决方案 【免费下载链接】Euro-Truck-Simulator-2-Lane-Assist Plugin based interface program for ETS2/ATS. 项目地址: https://gitcode.com/gh_mirrors/eur/Euro-Truck-Simulator-2-Lane-Assist 你是否曾梦想在…...

Photoshop图层批量导出效率革命:10倍速免费脚本完全指南

Photoshop图层批量导出效率革命:10倍速免费脚本完全指南 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script from Adobe. 项目地址: h…...

用STM32F103和RC522模块DIY一个智能门禁,附完整代码和PCB文件

用STM32F103和RC522模块打造高性价比智能门禁系统 在创客圈子里,智能门禁系统一直是极受欢迎的DIY项目。它不仅融合了嵌入式开发、射频识别和物联网技术,还能解决生活中的实际问题。相比动辄上千元的商业门禁设备,用STM32F103C8T6&#xff0…...

OpenCV颜色操作避坑指南:cv::Scalar里BGR和RGB顺序别再搞混了

OpenCV颜色操作避坑指南:cv::Scalar里BGR和RGB顺序别再搞混了 第一次用OpenCV画红色矩形时,我信心满满地写下cv::Scalar(255, 0, 0),结果屏幕上却出现了一个蓝色方块——这个场景恐怕每个OpenCV初学者都遇到过。颜色通道顺序这个看似简单的细…...

Acepe:下一代AI驱动的开发者环境,实现多代理协同与可控编程

1. 项目概述:下一代AI驱动的开发者环境如果你和我一样,在过去一年里尝试过各种AI编程助手,从Copilot的代码补全到Cursor的聊天式编程,再到Claude Code的深度分析,你可能会发现一个共同的痛点:这些工具虽然强…...

从‘ylim auto’到‘ylim manual’:深入理解Matlab坐标轴范围管理机制与性能优化

从‘ylim auto’到‘ylim manual’:深入理解Matlab坐标轴范围管理机制与性能优化 在数据可视化领域,Matlab作为一款强大的科学计算工具,其图形系统的精细控制能力常常被低估。当我们处理静态数据时,坐标轴范围的自动调整&#xff…...

从零搭建ROS机器人视觉定位系统:AprilTag二维码实战指南

1. 为什么选择AprilTag做机器人视觉定位? 刚接触机器人视觉定位时,你可能听说过二维码、ArUco标记、AprilTag等各种方案。我最初用普通二维码做过实验,发现识别距离超过1米就经常丢帧,后来换成ArUco标记稳定性有所提升&#xff0c…...

基于AI与向量数据库构建个人智能知识库:Braindb项目全解析

1. 项目概述:从“脑数据库”到个人知识管理的革命最近在折腾个人知识管理工具的朋友,应该都听过一个词叫“第二大脑”。市面上从Notion、Obsidian到各种双链笔记,大家都在试图解决同一个问题:如何把散落在各处、不成体系的信息&am…...

技能设计指南:用产品思维构建个人可衡量技能体系

1. 项目概述与核心价值最近在和一些做产品、运营的朋友聊天,发现一个挺有意思的现象:大家手上都有一堆“技能”,比如会写文案、会做数据分析、会用某个设计软件,但真到了要系统性地提升自己,或者向别人清晰展示自己能力…...

如何用waifu2x-caffe轻松实现4倍无损放大?一个免费AI图像增强的完整方案

如何用waifu2x-caffe轻松实现4倍无损放大?一个免费AI图像增强的完整方案 【免费下载链接】waifu2x-caffe waifu2xのCaffe版 项目地址: https://gitcode.com/gh_mirrors/wa/waifu2x-caffe 你是否曾经遇到过这样的困扰:收藏多年的老照片模糊不清&am…...

地缘政治市场模拟器:ABM与NLP技术如何量化黑天鹅事件风险

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“hermes-geopolitical-market-sim”。光看名字,你可能会觉得这又是一个复杂到让人望而却步的宏观模型。但作为一个在量化分析和策略模拟领域摸爬滚打了十多年的从业者,我第一眼…...

别再手动敲命令了!用Ansible Playbook一键搞定Debian 12.9的桌面、网络和DNS配置

Ansible Playbook全自动部署Debian 12.9:从裸机到生产级桌面的终极实践 当面对数十台需要统一配置的Debian服务器时,手动敲命令不仅效率低下,更可能因人为失误导致环境差异。本文将展示如何用Ansible Playbook实现从最小化安装到完整生产环境…...

如何在Blender中实现CAD级精确建模:CAD_Sketcher完整指南

如何在Blender中实现CAD级精确建模:CAD_Sketcher完整指南 【免费下载链接】CAD_Sketcher Constraint-based geometry sketcher for blender 项目地址: https://gitcode.com/gh_mirrors/ca/CAD_Sketcher 你是否曾经在Blender中尝试创建精确的机械零件或建筑设…...

免费CAD软件LitCAD:让你10分钟掌握专业二维绘图的终极指南

免费CAD软件LitCAD:让你10分钟掌握专业二维绘图的终极指南 【免费下载链接】LitCAD A very simple CAD developed by C#. 项目地址: https://gitcode.com/gh_mirrors/li/LitCAD 还在为复杂昂贵的CAD软件发愁吗?今天我要向你推荐一款真正简单易用的…...

从开发工程师到产品经理,转型成功的5个关键因素

在软件行业的生态系统中,开发工程师与产品经理如同两条紧密交织的脉络,共同支撑着产品从概念到落地的全生命周期。对于软件测试从业者而言,观察这两种角色的转型路径,不仅能为自身职业发展提供多元视角,更能深刻理解产…...

【附源码】从零实现C语言链表库:设计思路与关键实现解析

【附源码】从零实现C语言链表库:设计思路与关键实现解析 链表作为最基础的数据结构之一,其实现质量直接反映了开发者对指针和内存管理的理解程度。本文将详细剖析一个完整的单链表实现,涵盖从基础操作到复杂算法的全部过程。 一、整体设计思路…...

Simulink-采样时间实战:从模型配置到模块级联的精准控制

1. Simulink采样时间基础概念 第一次接触Simulink建模时,很多人会被"采样时间"这个概念搞得一头雾水。我刚开始用Simulink做电机控制系统仿真时,就因为这个参数设置不当,导致仿真结果完全失真。简单来说,采样时间决定了…...

UnityLive2DExtractor:三步解锁Unity中的Live2D模型资源

UnityLive2DExtractor:三步解锁Unity中的Live2D模型资源 【免费下载链接】UnityLive2DExtractor Unity Live2D Cubism 3 Extractor 项目地址: https://gitcode.com/gh_mirrors/un/UnityLive2DExtractor 你是否曾经在Unity项目中遇到过精美的Live2D角色&#…...

形式化验证应用:从专家工具到芯片设计自动化验证的范式转变

1. 形式化验证的“特洛伊木马”:从专家工具到大众应用的范式转变在芯片设计的浩瀚战场上,验证工程师们与日益复杂的电路设计进行着一场永无止境的“特洛伊战争”。传统的动态仿真(Simulation)就像希腊联军,虽然兵强马壮…...

Windows网络性能测试终极指南:使用iperf3-win-builds轻松掌握网络诊断

Windows网络性能测试终极指南:使用iperf3-win-builds轻松掌握网络诊断 【免费下载链接】iperf3-win-builds iperf3 binaries for Windows. Benchmark your network limits. 项目地址: https://gitcode.com/gh_mirrors/ip/iperf3-win-builds 你是否曾经怀疑过…...

Steam成就管理器:如何高效管理游戏成就的完整指南

Steam成就管理器:如何高效管理游戏成就的完整指南 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager 你是否曾经为Steam游戏中那些难以完成的成就…...

初创团队如何借助Taotoken管理多项目AI模型成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创团队如何借助Taotoken管理多项目AI模型成本 对于资源有限的初创公司而言,在拥抱大模型技术的同时,有效…...