Django项目开发全链路:数据库操作、多环境配置、windows/linux项目部署一站式指南

Django项目开发全链路:数据库操作、多环境配置、windows/linux项目部署一站式指南

  • 一、项目初始化
  • 二、创建第一个应用
  • 三、数据库与数据模型的应用
  • 四、创建管理后台用户
  • 五、数据模型与数据库交互之添加
  • 六、数据模型与数据库交互之修改
  • 七、数据模型与数据库交互之查询
  • 八、数据模型与数据库交互之删除
  • 九、执行原始SQL语句
  • 十、视图改写为类视图
  • 十一、模板与静态资源
  • 十二、制作快捷命令行脚本
  • 十三、多环境配置,开发、测试、正式
  • 十四、windows项目部署(nssm)
  • 十五、windows项目部署(IIS)
  • 十六、linux项目部署(Supervisor)
  • 十七、解决静态资源无法加载(iis、nssm、supervisor、开发环境)
  • 十八、日志配置

一、项目初始化

1.运行uv add django 安装依赖,未使用uv管理工具可使用pip install django安装,uv教程:https://blog.csdn.net/randy521520/article/details/147001879
在这里插入图片描述
2.运行django-admin startproject demo创建项目
在这里插入图片描述

3.项目新建后的目录大致如下
在这里插入图片描述

manage.py: 一个命令行实用程序,可让您与此交互 Django项目以各种方式。
mysite/: 一个目录,它是实际Python包 项目。它的名称是您需要用于导入的Python包名称里面的任何东西 (例如mysite.urls)。
mysite/__init__.py: 一个空文件,它告诉Python这个目录应该被认为是一个Python包。
mysite/settings.py: 此Django的设置/配置项目。 Django设置会告诉你所有关于如何设置 工作。
mysite/urls.py: 此Django项目的URL声明;  Django驱动的网站的 “目录”。
mysite/asgi.py: ASGI兼容的web服务器的入口点 为你的项目服务。
mysite/wsgi.py: 兼容WSGI的web服务器的入口点 为你的项目服务。

4.修改demo下的urls.py
在这里插入图片描述
5.cd项目目录demo,运行uv run python manage.py runserver 6002启动服务,未使用uv管理工具可使用 python manage.py runserver 6002,访问:http://127.0.0.1:6002/,将管理后台登录页面,django官网地址:https://docs.djangoproject.com/en/5.2/
在这里插入图片描述
6.manage.py 相关命令如下

命令分类 命令名称 功能描述 常用度
项目与应用管理 startproject 创建新的 Django 项目 ⭐⭐⭐⭐⭐
startapp 在当前项目中创建一个新的应用 ⭐⭐⭐⭐⭐
开发服务器 runserver 启动开发服务器,默认运行在 127.0.0.1:8000 ⭐⭐⭐⭐⭐
数据库操作 makemigrations 根据模型变更创建新的数据库迁移文件 ⭐⭐⭐⭐⭐
migrate 应用数据库迁移,使模型与数据库同步 ⭐⭐⭐⭐⭐
flush 清空数据库中的所有数据,但不删除表 ⭐⭐⭐⭐
dbshell 启动数据库命令行工具 ⭐⭐⭐
数据导入导出 dumpdata 将数据库中的数据导出为 JSON 或 YAML 格式 ⭐⭐⭐⭐
loaddata 从 Fixture 文件(如 JSON)中加载数据到数据库 ⭐⭐⭐⭐
用户与权限管理 createsuperuser 创建超级用户,用于访问 Django 管理后台 ⭐⭐⭐⭐⭐
changepassword 更改指定用户的密码 ⭐⭐⭐
测试与检查 test 运行项目的测试套件 ⭐⭐⭐⭐⭐
check 检查 Django 项目的设置和配置是否存在问题 ⭐⭐⭐⭐⭐
迁移管理 showmigrations 显示所有应用的迁移历史和状态 ⭐⭐⭐⭐
sqlmigrate 生成指定迁移文件对应的 SQL 语句 ⭐⭐⭐
squashmigrations 将多个迁移文件压缩成一个
静态文件管理 collectstatic 收集所有静态文件到 STATIC_ROOT 目录,用于生产环境部署 ⭐⭐⭐⭐⭐
findstatic 查找静态文件的绝对路径
会话管理 clearsessions 删除过期的会话数据
国际化 compilemessages 编译多语言翻译文件
缓存 createcachetable 创建缓存表,用于数据库缓存
信息查看 showurls 显示项目的所有 URL 配置 ⭐⭐⭐
diffsettings 显示当前设置与 Django 默认设置之间的差异

二、创建第一个应用

1.cd项目目录demo,运行uv run python manage.py startapp school新建应用,未使用uv管理工具可使用python manage.py startapp school
在这里插入图片描述
2.应用新建后的目录大致如下
在这里插入图片描述

__init__.py - 包标识文件
admin.py - 管理员后台配置
apps.py - 应用配置
migrations/ - 数据库迁移目录
models.py - 数据模型定义
tests.py - 测试文件
views.py - 视图函数/类
'''''可选但常用的额外文件'''''
urls.py - URL路由配置
forms.py - 表单定义
serializers.py - DRF序列化器
managers.py - 自定义模型管理器
templates/ - HTML模板目录
static/ - 静态文件目录(CSS, JS, 图片)

在这里插入图片描述
3.修改demo中的settings.pym,在INSTALLED_APPS中加入school
在这里插入图片描述
4.修改school>views.py文件
在这里插入图片描述
5.新增school>urls.py文件
在这里插入图片描述
6.修改demo下的urls.py文件
在这里插入图片描述
7.此时访问http://127.0.0.1:6002/school/,就可以看到欢迎光临页面
在这里插入图片描述

三、数据库与数据模型的应用

1.修改demo下的settings.py,配置mysql数据库,name为连接的数据库名,需要确保该数据库已创建
在这里插入图片描述
2.安装pymysql,并修改demo下的__init__.py,作用是让pymysql 库伪装成 MySQLdb 库,以便在 Django 等框架中使用
在这里插入图片描述
3.修改school>models.py,创建一些学校公共的数据模型,如:班级、课程等

from django.contrib.auth.models import User
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
from django.utils import timezoneclass Class(models.Model):"""班级模型字段说明:- name: 班级名称,从预定义的年级名称中选择,具有唯一性- class_code: 班级代码,对应年级编号,具有唯一性- department: 班级类型,区分理科班、文科班等不同类型- max_students: 最大学生数,限制班级容量在1-100人之间- established_date: 成立日期,记录班级成立时间- graduation_date: 预计毕业日期,可为空的毕业时间预估- is_active: 是否活跃,标识班级当前状态- head_teacher: 班主任,外键关联到用户模型,可为空- created_at: 创建时间,自动记录数据创建时间- updated_at: 更新时间,自动记录最后修改时间- description: 班级描述,可选的详细说明文本预定义数据:- class_info: 包含1-8年级的详细信息字典- name_choices: 基于class_info生成的班级名称选项- class_code_choices: 基于class_info生成的班级代码选项- department_choices: 班级类型选项列表"""class_info = {'1':{'name': '一年级','description': '一年级 - 小学起始阶段,6-7岁'},'2':{'name': '二年级','description': '二年级 - 小学基础阶段,7-8岁'},'3':{'name': '三年级','description': '三年级 - 小学巩固阶段,8-9岁'},'4':{'name': '四年级','description': '四年级 - 小学提高阶段,9-10岁'},'5':{'name': '五年级','description': '五年级 - 小学进阶阶段,10-11岁'},'6':{'name': '六年级','description': '六年级 - 小学毕业阶段,11-12岁'},'7':{'name': '七年级','description': '七年级 - 初中起始阶段(初一),12-13岁'},'8':{'name': '八年级','description': '八年级 - 初中中间阶段(初二),13-14岁'}}# 基本信息name_choices = [(v['name'], v['description']) for k, v in class_info.items()]name = models.CharField(max_length=100, choices=name_choices,verbose_name='班级名称',unique=True,db_comment='\n'.join([f'{name}{description}' for name, description in name_choices]))class_code_choices = [(k, v['name']) for k, v in class_info.items()]class_code = models.CharField(max_length=20, choices=class_code_choices, verbose_name='班级代码', unique=True,db_comment='\n'.join([f'{code}{name}' for code, name in class_code_choices]))department_choices = [('science', '理科班'),('arts', '文科班'),('commercial', '商科班'),('general', '普通班'),('experimental', '实验班'),('international', '国际班'),]department = models.CharField(max_length=20, choices=department_choices, verbose_name='班级类型',db_comment='\n'.join([f'{code}{dep}' for code, dep in department_choices]))# 容量限制max_students = models.PositiveIntegerField(default=50,validators=[MinValueValidator(1), MaxValueValidator(100)],verbose_name='最大学生数',db_comment='最大学生数:1-100人')# 时间信息established_date = models.DateField(verbose_name='成立日期')graduation_date = models.DateField(verbose_name='预计毕业日期', null=True, blank=True)is_active = models.BooleanField(default=True, verbose_name='是否活跃',db_default=True)# 教师关系head_teacher = models.ForeignKey(User,on_delete=models.SET_NULL,null=True,blank=True,related_name='headed_classes',verbose_name='班主任')# 元数据created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')description = models.TextField(verbose_name='班级描述', blank=True)class Meta:verbose_name = '班级'verbose_name_plural = '班级管理'ordering = ['class_code', 'name']indexes = [models.Index(fields=['class_code', 'department']),models.Index(fields=['is_active']),]class Course(models.Model):"""课程模型"""course_info = {'1':{'name': '语文','description': '语文课程'},'2':{'name': '数学','description': '数学课程'},'3':{'name': '英语','description': '英语课程'},'4':{'name': '物理','description': '物理课程'},'5':{'name': '化学','description': '化学课程'},'6':{'name': '生物','description': '生物课程'},'7':{'name': '历史','description': '历史课程'},'8':{'name': '地理','description': '地理课程'},'9':{'name': '政治','description': '政治课程'},'10':{'name': '音乐','description': '音乐课程'},'11':{'name': '美术','description': '美术课程'},'12':{'name': '体育','description': '体育课程'},'13':{'name': '信息技术','description': '信息技术课程'},'14':{'name': '综合','description': '综合课程'}}# 基本信息name_choices = [(v['name'], v['description']) for k, v in course_info.items()]name = models.CharField(max_length=100, verbose_name='课程名称', choices=name_choices,db_comment='\n'.join([f'{name}{description}' for name, description in name_choices]))course_code_choices = [(k, v['name']) for k, v in course_info.items()]course_code = models.CharField(max_length=20, unique=True, verbose_name='课程代码', choices=course_code_choices,db_comment='\n'.join([f'{code}{name}' for code, name in course_code_choices]))description = models.TextField(verbose_name='课程描述', blank=True)# 学术信息course_type_choices = [('required', '必修课'),('elective', '选修课'),('practice', '实践课'),('experiment', '实验课'),('seminar', '研讨课'),]course_type = models.CharField(max_length=20, choices=course_type_choices, verbose_name='课程类型')# 学分和学时credits = models.PositiveIntegerField(default=2,validators=[MinValueValidator(1), MaxValueValidator(10)],verbose_name='学分')total_hours = models.PositiveIntegerField(default=36,validators=[MinValueValidator(1), MaxValueValidator(200)],verbose_name='总学时')# 班级关联target_classes = models.ManyToManyField(Class,related_name='courses',blank=True,verbose_name='开设班级',help_text='选择这门课程面向的班级')# 时间信息start_date = models.DateField(verbose_name='开课日期', default=timezone.now)end_date = models.DateField(verbose_name='结课日期', null=True, blank=True)is_active = models.BooleanField(default=True, verbose_name='是否开课')# 课程安排CLASS_SCHEDULE_CHOICES = [('mon1', '周一第1节'),('mon2', '周一第2节'),('mon3', '周一第3节'),('mon4', '周一第4节'),('tue1', '周二第1节'),('tue2', '周二第2节'),('tue3', '周二第3节'),('tue4', '周二第4节'),('wed1', '周三第1节'),('wed2', '周三第2节'),('wed3', '周三第3节'),('wed4', '周三第4节'),('thu1', '周四第1节'),('thu2', '周四第2节'),('thu3', '周四第3节'),('thu4', '周四第4节'),('fri1', '周五第1节'),('fri2', '周五第2节'),('fri3', '周五第3节'),('fri4', '周五第4节'),]schedule = models.CharField(max_length=10,choices=CLASS_SCHEDULE_CHOICES,verbose_name='上课时间')classroom = models.CharField(max_length=50, verbose_name='教室', blank=True)# 元数据created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')class Meta:verbose_name = '课程'verbose_name_plural = '课程管理'ordering = ['course_code', 'name']indexes = [models.Index(fields=['course_code', 'course_type']),models.Index(fields=['is_active'])]class CourseMaterial(models.Model):"""课程资料模型"""course = models.ForeignKey(Course,on_delete=models.CASCADE,related_name='materials',verbose_name='所属课程')title = models.CharField(max_length=200, verbose_name='资料标题')description = models.TextField(verbose_name='资料描述', blank=True)file = models.FileField(upload_to='course_materials/%Y/%m/%d/',verbose_name='资料文件')upload_date = models.DateTimeField(auto_now_add=True, verbose_name='上传时间')is_public = models.BooleanField(default=True, verbose_name='公开访问')class Meta:verbose_name = '课程资料'verbose_name_plural = '课程资料管理'ordering = [</

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97863.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GLib多线程编程实践:从数据结构到线程池的完整指南

引言 GLib是一个功能丰富、跨平台的C程序库,提供了大量高效且经过充分测试的数据结构与算法接口。本文将通过一个完整的实践案例,介绍如何使用GLib实现动态数组、链表、平衡二叉树和线程池,并分享在实际开发中遇到的常见问题及解决方案。 一、GLib核心数据结构实践 1.1 动…

LiteFlow:国产流程编排引擎体验

文章目录一、写在前面二、使用1、Springboot集成2、组件3、表达式4、上下文5、执行器6、脚本组件7、规则配置源8、元数据管理9、异步中的线程池10、动态构造11、决策路由12、生命周期13、其他三、总结一、写在前面 就不做过多介绍了。 官网&#xff1a;https://liteflow.cc/ …

Linux学习:生产者消费者模型

目录1. 生产者消费者模型的相关概念1.1 什么是生产者消费者模型1.2 生产者消费者模型的优势作用2. 多线程简单实现生产者消费者模型2.1 设计方案2.2 代码实现2.2.1 线程类2.2.2 BlockQueue类2.2.3 任务类2.2.4 主干代码1. 生产者消费者模型的相关概念 1.1 什么是生产者消费者模…

《深度学习》卷积神经网络:数据增强与保存最优模型解析及实现

目录 一、数据增强 1. 核心概念 2. 核心目的 3. 常用方法 4. 实现示例&#xff08;基于 PyTorch&#xff09; 5. 自定义数据集加载 二、保存最优模型 1. 核心概念 2. 实现步骤 &#xff08;1&#xff09;定义 CNN 模型 &#xff08;2&#xff09;定义训练与测试函数…

tcpdump用法

tcpdump用法tcpdump一、什么是tcpdump二、命令格式与参数三、参数列表四、过滤规则组合逻辑运算符过滤器关键字理解 Flag 标识符五、常用例子tcpdump 一、什么是tcpdump 二、命令格式与参数 option 可选参数&#xff1a;将在后边一一解释。 proto 类过滤器&#xff1a;根据协…

平衡车 - 电机调速

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 在我们的这篇文章当中&#xff0c;我们主要想要实现的功能的是电机调速功能。在我们的这篇文章中&#xff0c;主要实现的是开环的功能&#xff0c;而非闭环&#xff0c;也就是不加…

从利润率看价值:哪些公司值得长期持有?

&#x1f4a1; 为什么盯紧利润率&#xff1f; 投资者常常盯着营收增长&#xff0c;却忽略了一个更关键的指标——利润率。 收入可以靠规模“堆”出来&#xff0c;但利润率却是企业护城河的真实体现。心理学研究表明&#xff1a;当一个产品或服务被消费者认定为“不可替代”&a…

小迪web自用笔记25

传统文件上传&#xff1a;上传至服务器本身硬盘。云存储&#xff1a;借助云存储oss对象存储&#xff08;只能被访问&#xff0c;不可解析&#xff09;Oss云存储Access key与Access ID&#xff1a;有了这两个东西之后就可以操作云存储&#xff0c;可以向里面发数据了。这玩意儿泄…

分发饼干——很好的解释模板

好的&#xff0c;孩子&#xff0c;我们来玩一个“喂饼干”的游戏。 0. 问题的本质是什么&#xff1f; 想象一下&#xff0c;你就是个超棒的家长&#xff0c;手里有几块大小不一的饼干&#xff0c;而面前有几个饿着肚子的小朋友。每个小朋友都有一个最小的“胃口”值&#xff0c…

场景题:如果一个大型项目,某一个时间所有的CPU的已经被占用了,导致服务不可用,我们开发人员应该如何使服务器尽快恢复正常

问&#xff1a;如果一个大型项目,某一个时间所有的CPU的 已经被占用了&#xff0c;导致服务不可用&#xff0c;我们开发人员 应该如何使服务器尽快恢复正常答&#xff1a;应对CPU 100%导致服务不可用的紧急恢复流程面试官&#xff0c;如果遇到这种情况&#xff0c;我会立即按照…

Docker 安装 RAGFlow保姆教程

前提条件 Ubuntu 服务器(20.04 或 22.04 LTS 推荐) 已安装 Docker 和 Docker Compose 如果尚未安装,请先运行以下命令:# 安装 Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # 将当前用户加入 docker 组,避免每次都要 sudo sudo user…

为什么实际工程里 C++ 部署深度学习模型更常见?为什么大家更爱用 TensorRT?

很多人刚接触深度学习模型部署的时候&#xff0c;都会习惯用 Python&#xff0c;因为训练的时候就是 PyTorch、TensorFlow 啊&#xff0c;写起来方便。但一到 实际工程&#xff0c;特别是工业设备、医疗影像、上位机系统这种场景&#xff0c;你会发现大多数人都转向了 C 部署。…

深入理解 Java 集合框架:底层原理与实战应用

在日常开发中&#xff0c;集合是 Java 中使用频率最高的工具之一。从最常见的 ArrayList、HashMap 到更复杂的并发集合&#xff0c;几乎每一个 Java 程序员都离不开集合框架。集合框架不仅提供了丰富的数据结构实现&#xff0c;还封装了底层复杂的逻辑&#xff0c;让开发者能够…

爬取m3u8视频完整教程

爬取步骤&#xff1a;1.先找到网页源代码2.从网页源代码中拿到m3u83.下载m3u84.读取m3u8文件&#xff0c;下载视频5.合并视频首先我们来爬取一个星辰影院的电影&#xff1a;下面我以这个为例&#xff1a;我们需要在源代码中找到m3u8这个url&#xff1a;紧接着我们利用下面的方法…

Python爬虫实战: 基于Scrapy的Amazon跨境电商选品数据爬虫方案

概述与设计思路 利用Python的Scrapy框架进行大规模页面抓取和结构化数据提取,配合aiohttp实现高并发请求,从而高效获取Amazon平台上的商品列表、详情、评论等公开信息。通过对这些数据进行清洗与分析,可以识别出有潜力的商品,评估市场竞争程度,并跟踪竞争对手的动态,为跨…

稳定版IM即时通讯 仿默往APP即时通讯im源码聊天社交源码支持二开原生开发独立部署 含搭建教程

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 技术开发语言&#xff1a; 后台管理端&#xff1a;Java GO Mysql数据库 安卓端&#xff1a;Java iOS端&#xff1a;ob PC端&#xff1a;c 功能简单介绍&#xff1a; 单聊&#xff…

封装一个redis获取并解析数据的工具类

redis获取并解析数据工具类实现代码使用示例实现代码 import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import lom…

23种设计模式——策略模式 (Strategy Pattern)​详解

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;设计模式 ✨特色专栏&#xff1a;知识分享 &#x…

CI(持续集成)、CD(持续交付/部署)、CT(持续测试)、CICD、CICT

目录 **CI、CD、CT 详解与关系** **1. CI(Continuous Integration,持续集成)** **2. CD(Continuous Delivery/Deployment,持续交付/部署)** **持续交付(Continuous Delivery)** **持续部署(Continuous Deployment)** **3. CT(Continuous Testing,持续测试)** **4.…

【音视频】WebRTC ICE 模块深度剖析

原文链接&#xff1a; https://mp.weixin.qq.com/s?__bizMzIzMjY3MjYyOA&mid2247498075&idx2&sn6021a2f60b1e7c71ce4d7af6df0b9b89&chksme893e540dfe46c56323322e780d41aec1f851925cfce8b76b3f4d5cfddaa9c7cbb03a7ae4c25&scene178&cur_album_id314699…