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

Django+MySQL接口开发完全指南

前言

本文将详细介绍如何使用Django结合MySQL数据库开发RESTful API接口。我们将从环境搭建开始,一步步实现一个完整的接口项目。

环境准备

首先需要安装以下组件:

  • Python 3.8+
  • Django 4.2
  • MySQL 8.0
  • mysqlclient
  • djangorestframework

安装命令

# 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Windows使用 venv\Scripts\activate# 安装依赖
pip install django==4.2
pip install mysqlclient
pip install djangorestframework

项目创建与配置

1. 创建项目

django-admin startproject myproject
cd myproject
python manage.py startapp api

2. 配置settings.py

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','rest_framework',  # 添加rest_framework'api',  # 添加api应用
]# 数据库配置
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'django_demo','USER': 'root','PASSWORD': 'your_password','HOST': '127.0.0.1','PORT': '3306',}
}# REST框架配置
REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination','PAGE_SIZE': 10,
}

数据库模型设计

1. 创建模型(api/models.py)

from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=100, verbose_name='书名')author = models.CharField(max_length=50, verbose_name='作者')price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='价格')publish_date = models.DateField(verbose_name='出版日期')created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')class Meta:db_table = 'books'verbose_name = '图书'verbose_name_plural = verbose_nameordering = ['-created_at']def __str__(self):return self.title

2. 生成并应用数据库迁移

python manage.py makemigrations
python manage.py migrate

序列化器开发

1. 创建序列化器(api/serializers.py)

from rest_framework import serializers
from .models import Bookclass BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['id', 'title', 'author', 'price', 'publish_date', 'created_at', 'updated_at']read_only_fields = ['created_at', 'updated_at']

视图开发

1. 创建视图(api/views.py)

from rest_framework import viewsets, filters
from rest_framework.response import Response
from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend
from .models import Book
from .serializers import BookSerializerclass BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializerfilter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]filterset_fields = ['author']search_fields = ['title', 'author']ordering_fields = ['price', 'publish_date']@action(detail=False, methods=['get'])def get_book_stats(self, request):"""获取图书统计信息"""total_books = Book.objects.count()total_authors = Book.objects.values('author').distinct().count()avg_price = Book.objects.aggregate(avg_price=models.Avg('price'))return Response({'total_books': total_books,'total_authors': total_authors,'average_price': avg_price['avg_price']})

URL配置

1. 配置项目URLs(myproject/urls.py)

from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from api.views import BookViewSetrouter = DefaultRouter()
router.register(r'books', BookViewSet)urlpatterns = [path('admin/', admin.site.urls),path('api/', include(router.urls)),
]

中间件开发

1. 创建自定义中间件(api/middleware.py)

import time
from django.utils.deprecation import MiddlewareMixin
import logginglogger = logging.getLogger(__name__)class RequestLogMiddleware(MiddlewareMixin):def process_request(self, request):request.start_time = time.time()def process_response(self, request, response):if hasattr(request, 'start_time'):duration = time.time() - request.start_timelogger.info(f'{request.method} {request.path} - {response.status_code} - {duration:.2f}s')return response

2. 在settings.py中注册中间件

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','api.middleware.RequestLogMiddleware',  # 添加自定义中间件
]

异常处理

1. 创建自定义异常处理(api/exceptions.py)

from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import statusdef custom_exception_handler(exc, context):response = exception_handler(exc, context)if response is None:return Response({'error': str(exc),'message': '服务器内部错误'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)return response

2. 在settings.py中配置异常处理器

REST_FRAMEWORK = {'EXCEPTION_HANDLER': 'api.exceptions.custom_exception_handler'
}

API接口测试

1. 创建测试用例(api/tests.py)

from rest_framework.test import APITestCase
from rest_framework import status
from .models import Book
from datetime import dateclass BookTests(APITestCase):def setUp(self):self.book_data = {'title': 'Django实战','author': '张三','price': '59.99','publish_date': '2024-01-01'}self.book = Book.objects.create(**self.book_data)def test_create_book(self):"""测试创建图书"""response = self.client.post('/api/books/', self.book_data, format='json')self.assertEqual(response.status_code, status.HTTP_201_CREATED)self.assertEqual(Book.objects.count(), 2)def test_get_book_list(self):"""测试获取图书列表"""response = self.client.get('/api/books/')self.assertEqual(response.status_code, status.HTTP_200_OK)self.assertEqual(len(response.data['results']), 1)

API接口文档

使用drf-yasg生成Swagger文档:

1. 安装drf-yasg

pip install drf-yasg

2. 配置settings.py

INSTALLED_APPS = [...'drf_yasg',
]

3. 配置URLs(myproject/urls.py)

from django.urls import path, include, re_path
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapischema_view = get_schema_view(openapi.Info(title="图书管理API",default_version='v1',description="图书管理系统API文档",terms_of_service="https://www.yourapp.com/terms/",contact=openapi.Contact(email="contact@yourapp.com"),license=openapi.License(name="BSD License"),),public=True,permission_classes=(permissions.AllowAny,),
)urlpatterns = [...re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
]

接口使用示例

1. 创建图书

curl -X POST http://localhost:8000/api/books/ \-H "Content-Type: application/json" \-d '{"title":"Django实战","author":"张三","price":"59.99","publish_date":"2024-01-01"}'

2. 获取图书列表

curl http://localhost:8000/api/books/

3. 更新图书

curl -X PUT http://localhost:8000/api/books/1/ \-H "Content-Type: application/json" \-d '{"title":"Django实战(第二版)","author":"张三","price":"69.99","publish_date":"2024-01-01"}'

4. 删除图书

curl -X DELETE http://localhost:8000/api/books/1/

性能优化建议

  1. 使用数据库索引
    class Book(models.Model):...class Meta:indexes = [models.Index(fields=['title']),models.Index(fields=['author']),]
  2. 使用缓存
    from django.core.cache import cacheclass BookViewSet(viewsets.ModelViewSet):def list(self, request):cache_key = 'book_list'cached_data = cache.get(cache_key)if cached_data is None:queryset = self.filter_queryset(self.get_queryset())serializer = self.get_serializer(queryset, many=True)cached_data = serializer.datacache.set(cache_key, cached_data, timeout=300)  # 缓存5分钟return Response(cached_data)

总结

本文详细介绍了使用Django开发RESTful API的完整流程,包括:

  1. 环境搭建和项目配置
  2. 数据库模型设计
  3. 序列化器开发
  4. 视图和URL配置
  5. 中间件和异常处理
  6. 测试用例编写
  7. API文档生成
  8. 性能优化建议

通过按照本教程的步骤,你可以快速搭建一个功能完善的Django API项目。建议在实际开发中根据具体需求进行适当调整和扩展。

 

相关文章:

Django+MySQL接口开发完全指南

前言 本文将详细介绍如何使用Django结合MySQL数据库开发RESTful API接口。我们将从环境搭建开始&#xff0c;一步步实现一个完整的接口项目。 环境准备 首先需要安装以下组件&#xff1a; Python 3.8Django 4.2MySQL 8.0mysqlclientdjangorestframework 安装命令 # 创建虚…...

CentOS7上下载安装 Docker Compose

Docker Compose简要介绍&#xff08;想直接看安装步骤的请跳转到[必要的安装步骤]&#xff09; Docker Compose 是一个用于定义和管理多容器 Docker 应用的工具&#xff0c;它可以通过一个简单的 YAML 文件&#xff08;docker-compose.yml&#xff09;来配置应用程序的服务、网…...

虚拟机的 NAT 模式 或 Bridged 模式能够被外界IPping通

如果虚拟机使用的是 NAT 模式 或 Bridged 模式&#xff0c;通常可以让外部网络&#xff08;例如互联网&#xff09;访问虚拟机。NAT 和 Bridged 模式的不同之处在于它们如何将虚拟机连接到宿主机和外部网络。以下是这两种模式的详细说明&#xff1a; 1. NAT 模式 在 NAT 模式…...

C# 使用Dll的几种方法举例

使用 DLL&#xff08;动态链接库&#xff09;是 C# 开发中常见的任务之一。DLL 文件包含可以在运行时加载的代码和数据&#xff0c;允许程序共享功能和资源&#xff0c;降低程序的内存占用并促进代码的复用。本篇文章将深入探讨 C# 中使用 DLL 的多种方法&#xff0c;并提供相关…...

什么是不同类型的微服务测试?

大家好&#xff0c;我是锋哥。今天分享关于【什么是不同类型的微服务测试&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是不同类型的微服务测试&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 微服务架构中的测试可以分为多种类…...

Docker 拉取镜像时配置可用镜像源(包含国内可用镜像源)

在/etc/docker/daemon.json中写入如下内容(如果文件不存在请新建该文件)&#xff1a; { "registry-mirrors":["https://registry.docker-cn.com"] } 重新加载 json 配置文件&#xff1a; sudo systemctl daemon-reload重启 docker 服务&#xff1a; sud…...

International Symposium on Artificial Intelligence Innovations

计算机科学&#xff08;Computer Science&#xff09;&#xff1a; 算法、自动化软件工程、生物信息学和科学计算、计算机辅助设计、计算机动画、计算机体系结构、计算机建模、计算机网络、计算机安全、计算机图形学与图像处理、数据库与数据挖掘、数据压缩、数据加密、数字信号…...

Golang笔记_day10

Go面试题&#xff08;三&#xff09; 1、什么是channel&#xff0c;为什么它可以做到线程安全 在Go语言中&#xff0c;channel是一种类型&#xff0c;它可以用来在协程之间传递数据通过共享内存来通信&#xff1a; 通过共享内存来通信是指多个线程或进程直接访问相同的内存区域…...

mlir learn

https://github.com/j2kun/mlir-tutorial 学习这个项目 https://www.jeremykun.com/2023/08/10/mlir-getting-started/ get start 用我的mac编译一下试试看 然后遇到架构不对的问题 因为他的提交默认是x86 https://github.com/j2kun/mlir-tutorial/pull/1/commits/5a267e269d57…...

Windows安装RabbitMQ 4.0.2(图文教程)

本章教程,主要记录在Windows 10上RabbitMQ 4.0.2的安装过程。 一、下载安装包 1、官方下载(速度不稳定) Erlang:https://github.com/erlang/otp/releases/download/OTP-26.0/otp_win64_26.0.exe RabbitMQ 4.0.2:https://github.com/rabbitmq/rabbitmq-server/releases/do…...

分布式系统中为什么需要使用消息队列

本文转载自 linkedkeeper.com 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。 当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&#…...

Linux环境配置(学生适用)

1.挑选最便宜的云服务器 如腾讯云服务器&#xff0c;华为云服务器&#xff0c;百度云服务器等等…… 2.找到你的云服务器实例&#xff0c;然后找到你的公网IP。 3.云服务器实例 ---更多 --- 重置root密码 (一定要重置&#xff09; 4. 下载并安装 xshell 或者其他登陆软件 xshel…...

麦禾软件:Mac用户找免费开源工具的最佳选择

抖知书老师推荐&#xff1a; ​麦禾软件已经成为众多Mac用户的必备平台&#xff0c;尤其对于那些经常寻找免费、开源、正版软件的用户来说&#xff0c;绝对是一个福音。随着科技的不断进步和用户需求的提升&#xff0c;安全、便捷的软件下载体验成为用户选择平台的核心标准。而…...

OpenCV4.8 开发实战系列专栏之 08 - 通道分离与合并

大家好&#xff0c;欢迎大家学习OpenCV4.8 开发实战专栏&#xff0c;长期更新&#xff0c;不断分享源码。 专栏代码全部基于C 与Python双语演示&#xff0c;专栏答疑群 请联系微信 OpenCVXueTang_Asst 本文关键知识点&#xff1a; OpenCV中默认imread函数加载图像文件&#…...

iOS 18.1 RC 版本发布,修复iPhone16随机重启、浏览视频卡顿等bug

今日&#xff0c;苹果发布 iOS 18.1 RC 版本升级&#xff0c;内部版本号为 22B82。 iOS 18.1 RC 也就是 iOS 18.1 准正式版&#xff0c;如果没有大的 Bug&#xff0c;这将是 iOS 18.1 正式版发布前最后一次更新&#xff0c;正式版预计下周向消费者推送。 该 RC 版除了为海外用…...

安装buildkit,并使用buildkit构建containerd镜像

背景 因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://github.com/moby/buildkit 简介 服务端为buildkitd,负责和runc或containerd后端连接干活,目前…...

maven jar包二进制文件 invalid stream header: EFBFBDEF 的错误

背景&#xff1a; 将jasper模板文件导入jar包后&#xff0c;生成文件报错 org.springframework.core.io.Resource resource new ClassPathResource("/template/XXXX.jasper");jasperPrint JasperFillManager.fillReport(resource.getInputStream(), paramentMap, …...

Git绑定Gitee或Github以及Git面试常见题

1.绑定Git或Gitee Git绑定Gitee或GitHub的过程相对简单&#xff0c;以下是详细的步骤说明&#xff1a; 一、绑定Gitee仓库 在Gitee上创建仓库 登录Gitee官网&#xff0c;点击首页右上角的“”号&#xff0c;选择“新建仓库”。在新建仓库页面&#xff0c;输入仓库的名称、描述…...

值得细读的8个视觉大模型生成式预训练方法

写在前面 大语言模型的进展催生出了ChatGPT这样的应用&#xff0c;让大家对“第四次工业革命”和“AGI”的来临有了一些期待&#xff0c;也作为部分原因共同造就了美股2023年的繁荣。LLM和视觉的结合也越来越多&#xff1a;比如把LLM作为一种通用的接口&#xff0c;把视觉特征…...

go 包相关知识

在Go语言中&#xff0c;包的引用和搜索路径是由环境变量GOPATH和GO111MODULE共同决定的。 GOPATH环境变量&#xff1a;这个变量定义了默认的工作目录&#xff0c;Go命令行工具将会在这个目录下查找包文件。这个目录通常包含三个子目录&#xff1a;src、bin和pkg。 src目录包含…...

OpenClaw故障自愈方案:百川2-13B模型异常日志分析与重试机制

OpenClaw故障自愈方案&#xff1a;百川2-13B模型异常日志分析与重试机制 1. 问题背景与需求场景 上周我在用OpenClaw对接百川2-13B模型处理夜间自动化任务时&#xff0c;遇到了一个典型问题&#xff1a;凌晨3点突然收到飞书告警&#xff0c;显示"模型响应超时"。当…...

OpenClaw备份策略:nanobot镜像的模型权重与技能配置定期同步

OpenClaw备份策略&#xff1a;nanobot镜像的模型权重与技能配置定期同步 1. 为什么需要备份OpenClaw工作区 上周我的开发机突然蓝屏&#xff0c;硬盘分区表损坏。当我发现过去三个月精心调教的OpenClaw技能配置和模型微调权重全部丢失时&#xff0c;那种痛彻心扉的感觉让我意…...

Windows环境下SpringBoot Jar包热更新实战:从配置文件到Class文件的动态替换

1. Windows下SpringBoot Jar包热更新核心原理 SpringBoot应用打包成Jar后&#xff0c;本质上是个压缩文件。在Windows环境下&#xff0c;我们可以利用JDK自带的jar命令直接操作这个压缩包。热更新的本质就是在不重启服务的情况下&#xff0c;通过替换Jar包内部文件来实现配置或…...

Qwen3-ForcedAligner-0.6B实战:基于CNN的语音特征提取优化

Qwen3-ForcedAligner-0.6B实战&#xff1a;基于CNN的语音特征提取优化 如果你做过语音相关的项目&#xff0c;比如给视频加字幕、做语音分析&#xff0c;肯定遇到过这样的问题&#xff1a;模型识别出的文字&#xff0c;怎么才能和音频里的时间点对上号&#xff1f;这就是“强制…...

Phi-3-Mini-128K实操手册:模型加载耗时优化技巧——分层加载与缓存机制应用

Phi-3-Mini-128K实操手册&#xff1a;模型加载耗时优化技巧——分层加载与缓存机制应用 1. 项目概述 Phi-3-Mini-128K是基于微软Phi-3-mini-128k-instruct模型开发的轻量化对话工具&#xff0c;专为本地部署和高效推理场景设计。该工具通过多项技术创新&#xff0c;显著提升了…...

UEFITool终极指南:掌握UEFI固件解析与编辑的核心技术

UEFITool终极指南&#xff1a;掌握UEFI固件解析与编辑的核心技术 【免费下载链接】UEFITool UEFI firmware image viewer and editor 项目地址: https://gitcode.com/gh_mirrors/ue/UEFITool UEFITool是一款功能强大的开源UEFI固件分析工具&#xff0c;能够深入解析和编…...

单片机串口通信原理与应用详解

单片机串口通信技术详解1. 串口通信基础概念1.1 串行通信原理串行通信是一种仅使用一根接收线(RX)和一根发送线(TX)进行数据传输的通信方式。与并行通信相比&#xff0c;虽然传输速度较慢&#xff0c;但具有布线简单、成本低的优势。典型的串口通信系统包含三根基本信号线&…...

OpenClaw+GLM-4.7-Flash:自动化测试脚本生成器

OpenClawGLM-4.7-Flash&#xff1a;自动化测试脚本生成器 1. 为什么需要自动化测试脚本生成 作为一名长期奋战在一线的开发者&#xff0c;我深知测试环节的重要性与繁琐程度。每当项目进入测试阶段&#xff0c;编写测试用例和脚本往往要占据整个开发周期的30%-40%时间。更令人头…...

Vue 3 双向绑定进阶:useModel与defineModel的实战对比与选型指南

1. Vue 3双向绑定技术演进 双向数据绑定一直是Vue框架的核心特性之一。在Vue 3.4版本中&#xff0c;团队引入了两个新的API&#xff1a;useModel和defineModel&#xff0c;它们为开发者提供了更灵活的数据绑定方案。这两个API虽然目的一致&#xff0c;但在使用场景和实现方式上…...

5大核心功能!植物大战僵尸辅助神器PvZ Toolkit全解析

5大核心功能&#xff01;植物大战僵尸辅助神器PvZ Toolkit全解析 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PvZ Toolkit是一款专为植物大战僵尸PC版设计的综合修改器&#xff0c;通过直观的图…...