Python 框架学习 Django篇 (三) 链接数据库
只要你是做后端开发的,那么就离不开各种数据库,Django框架对各种数据库都非常友好,比如常见的PostgreSQL、MySQL、SQLite、Oracle,django都对他们提供了统一调用api,我们这里主要使用mysql数据库作为演示
一、ORM机制
ORM机制,又称为对象关系映射,简单来说就是通过定义python文件中的class类,然后通过ORM将python代码转换成sql语句,再通过pymysql库链接到mysql数据库,执行sql语句

1、ORM 解析过程
1、ORM 会将 Python 代码转成为 SQL 语句。
2、SQL 语句通过 pymysql 传送到数据库服务端。
3、在数据库中执行 SQL 语句并将结果返回。
2、python代码与sql语句关系图

二、基本使用
1、准备mysql数据库
#部署容器
docker run --name mysql8 \
-p 30013:3306 \
-d \
-v /home/data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /home/data/mysql/data:/var/lib/mysql \
-v /home/data/mysql/log:/logs \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always mysql:8.0 \
--lower_case_table_names=1#创建数据库
create database paas default charset=utf8; #授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
ORM机制无法创建数据库级别操作,只能创建表
2、安装pymysql库
pip3 install pymysql
pip3 install cryptography
3、配置django项目指定数据库
vi Django_demo\Django_demo\settings.py
#找到DATABASES 修改配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎'NAME': 'paas', # 数据库名称'HOST': '101.43.156.78', # 数据库地址'PORT': 3306, # 端口 'USER': 'root', # 数据库用户名'PASSWORD': '123456', # 数据库密码}
}
在settings.py的同级目录下找到__init__.py 文件添加
vi Django_demo\Django_demo\__init__.py
# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()
4、创建新项目
django-admin startapp paas

5、添加数据库表 模型
vi Django_demo/paas/models.py
from django.db import models#相当于是定义了表中存储数据的字段
class PaasInfo(models.Model):# 集群名称ClusterName = models.CharField(max_length=200)# node主机数量NodeSum = models.CharField(max_length=200)# prometheus地址PrometheusAddress = models.CharField(max_length=200)
配置说明
class PaasInfo #定义数据表的名称 class 等同于数据库中的表ClusterName = models.CharField(max_length=200)ClusterName #定义数据表中字段的名称
models.CharField #字段类型为字符串 (varchar)
max_length=200 #字段数据长度最大为200字节
6、添加联系数据库表
vi Django_demo/paas/apps.py
#这里的name相当于是当前应用的唯一标识
class CommonConfig(AppConfig):name = 'paas' #说明
CommonConfig 类是一个继承自 AppConfig 的应用程序配置类。这个类的作用是为定义的应用程序提供配置信息。在 CommonConfig 类中,name 属性被设置为 'paas',表示该应用程序的名称是 "paas"。通过在应用程序中定义一个配置类,您可以为应用程序指定自定义的配置参数。这些配置参数可以在 Django 的设置文件中进行进一步的配置,例如指定模型文件、URL 路由和静态文件位置等。对于一个简单的 Django 应用程序来说,name 属性的设置是必需的,它用于唯一标识应用程序并在 Django 项目中进行引用。其他的配置参数包括 verbose_name 属性,用于指定应用程序的显示名称。
vi Django_demo/Django_demo/settings.py
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',#添加如下配置,也可以直接写paas'paas.apps.CommonConfig',
]
这里有个小区别说明一下,上面的'paas.apps.CommonConfig', 也可以写错'paas',
通过直接添加
paas, Django 将使用默认的应用程序配置类来初始化该应用程序。通过添加'paas.apps.CommonConfig',可以指定自定义的应用程序配置类,并且可以在其中定义更多的配置参数和行为。
7、测试model配置并生成更新脚本
#命令大意为 查看paas应用下的models.py 定义了什么
#将定义的语句转换成操作数据库的脚本文件
python manage.py makemigrations paas
返回
Migrations for 'paas':paas\migrations\0001_initial.py- Create model PaasInfo
上面获取到的信息中Django_demo/paas/migrations/0001_initial.py 是我们基于定义的model获取到的用于创建数据库和表的一个python语句
8、运行数据库操作脚本
python manage.py migrate
返回
Operations to perform: Apply all migrations: admin, auth, contenttypes, paas, sessions
Running migrations:Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying auth.0010_alter_group_name_max_length... OKApplying auth.0011_update_proxy_permissions... OKApplying auth.0012_alter_user_first_name_max_length... OKApplying paas.0001_initial... OKApplying sessions.0001_initial... OK
9、查看数据
#登录paas数据库
use paas#查看paas库下的表
show tables;#查看表结构
desc paas_paasinfo;

如果以后我们修改了Models.py 里面的库表的定义,都需要再次运行 python manage.py makemigrations common 和 python manage.py migrate 命令,使数据库同步该修改结果
三、Django admin页面
Django提供了一个管理员操作界面可以方便的 添加、修改、删除你定义的 model 表数据
1、创建超级用户
python manage.py createsuperuser#填写
用户 root
邮箱 123@qq.com
密码 12345678
再次输入密码 12345678
2、注册应用model
vi Django_demo/paas/admin.py
from django.contrib import admin# Register your models here.
from .models import PaasInfoadmin.site.register(PaasInfo)
3、访问管理平台
启动服务
python manage.py runserver
访问页面
http://127.0.0.1:8000/admin/

4、添加UI
pip3 install django-simpleui
vi Django_demo/Django_demo/settings.py
INSTALLED_APPS = ['simpleui', #添加到第一行'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','paas',
]
5、再次访问

6、添加测试数据
7、验证
select * from paas_paasinfo;

四、数据库读取
我们在上面实现了链接数据库并插入数据,如果我们想要将数据从数据库读取出来,并且打印到页面上,应该怎么操作呢,下面我们尝试实现访问/
sales/SelectHost 路径时返回数据库中PaasInfo 表下的所有数据
1、添加子应用下路由文件
vi Django_demo/Django_demo/urls.py
from django.contrib import admin
from django.urls import path#添加
from django.urls import include urlpatterns = [path('admin/', admin.site.urls),#在主路由上添加,当请求sales开头时都会把请求交给paas应用下的urlspath('sales/', include('paas.urls')),
]
添加后就允许子应用添加自己的路由配置了
2、定义视图
vi Django_demo/paas/views.py
from django.http import HttpResponsefrom .models import PaasInfodef listcustomers(request):#拿到我们之前定义的表的模型函数,请求后返回一个包含所有数据的QuerySet对象#每行数据都是一个dict, key的名称是字段名 Value是值qs = PaasInfo.objects.values()# 定义返回字符串retStr = ''for customer in qs:for name,value in customer.items():retStr += f'{name} : {value} | '# <br> 表示换行,在返回值中带上换行,那么页面上显示也会生效retStr += '<br>'return HttpResponse(retStr)
3、新增子路由
vi Django_demo/paas/urls.py
from django.urls import pathfrom .views import listcustomers
urlpatterns = [#paas应用上的路由只需要定义自己路由的部分即可path('SelectHost/',listcustomers ),]
4、测试访问
http://127.0.0.1:8000/sales/SelectHost/

五、过滤数据
有的时候,我们需要根据过滤条件查询部分客户信息
比如,当用户在浏览器输入 http://127.0.0.1:8000/sales/SelectHost/?NodeSum=123123
可以查询到node主机数量为123123台的信息,实现他的方法是添加filter方法进行过滤
vi Django_demo/paas/views.py
def listcustomers(request):#获取表全量数据qs = PaasInfo.objects.values()#检查url中是否有参数NodeSum#如果没有值,则返回给ph值为后面的Noneph = request.GET.get('NodeSum',None)#判断如果有的话, 就将值赋予给字段进行筛选后赋值覆盖全量数据if ph:qs = qs.filter(NodeSum=ph)# 循环遍历全量数据并打印到页面retStr = ''for customer in qs:for name,value in customer.items():retStr += f'{name} : {value} | '# <br> 表示换行retStr += '<br>'return HttpResponse(retStr)
测试
http://127.0.0.1:8000/sales/SelectHost/?NodeSum=123123
六、前后端分离架构
上面我们返回给页面的数据如下,非常杂乱并不方便查看,因为我们只是将数据返回给页面,而返回的页面并没有css、js等样式或功能,我们下面给返回的数据添加一些显示格式

1、代码直接生成HTML
html代码本身也是字符串,我们可以把整个html定义到我们程序中的字符串进行接收
vi Django_demo/paas/views.py
from django.http import HttpResponsefrom .models import PaasInfo#添加html模板变量
html_template ='''
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
table {border-collapse: collapse;
}
th, td {padding: 8px;text-align: left;border-bottom: 1px solid #ddd;
}
</style>
</head><body><table><tr><th>id</th><th>姓名</th><th>电话号码</th><th>地址</th></tr>%s</table></body>
</html>
'''
def listcustomers(request):qs = PaasInfo.objects.values()ph = request.GET.get('NodeSum',None)if ph:qs = qs.filter(NodeSum=ph)# 生成html模板中要插入的html片段内容tableContent = ''for customer in qs:tableContent += '<tr>' #没循环一次取到的数据都换到零一和for name,value in customer.items(): #取每个字段的数据,并作为当前行的值tableContent += f'<td>{value}</td>'tableContent += '</tr>' #最后添加</tr> 表示当前行结束return HttpResponse(html_template%tableContent) #模板变量名称 + % + 返回数据的模板
测试

我们用一个变量 html_template 存储html模板, 然后 代码中生成html 里面需要插入的表格记录的内容,这个内容是html片段,也就是 html 表格的每行 。
2、使用html模板
上面我们直接定义在变量中的html并不方便管理 很多后端框架都提供了一种 模板技术, 可以在html 中嵌入编程语言代码片段, 用模板引擎(就是一个专门处理HTML模板的库)来动态的生成HTML代码,Python 中有很多这样的模板引擎 比如 jinja2 、Mako, Django也内置了一个这样的模板引擎,我们这里使用django 去渲染html
from django.http import HttpResponsefrom .models import PaasInfo#添加html模板变量
html_template ='''
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
table {border-collapse: collapse;
}
th, td {padding: 8px;text-align: left;border-bottom: 1px solid #ddd;
}
</style>
</head><body><table><tr><th>id</th><th>姓名</th><th>电话号码</th><th>地址</th></tr>{% for customer in customers %}<tr>{% for name, value in customer.items %} <td>{{ value }}</td> {% endfor %}</tr>{% endfor %}</table></body>
</html>
'''from django.template import engines
django_engine = engines['django']
template = django_engine.from_string(html_template)def listcustomers(request):qs = PaasInfo.objects.values()ph = request.GET.get('NodeSum',None)if ph:qs = qs.filter(NodeSum=ph)# 传入渲染模板需要的参数rendered = template.render({'customers':qs})return HttpResponse(rendered)
使用上面的方法发现可以实现同样的显示效果,不过我们不需要在后端的函数中去定义各种tr这种属于前端页面显示的元素了,而是通过模板将需要返回的数据以变量 customers 交给页面,然后在使用下面for循环去变量从django拿到的数据进行展示
{% for customer in customers %}<tr>{% for name, value in customer.items %} <td>{{ value }}</td> {% endfor %}</tr>{% endfor %}
3、前后端分离架构
有了模板引擎,对我们后端开发来说,简化了程序员后端生成HTML的任务
但是,通常来说后端开发的核心任务不是开发前端界面,并且大部分后端开发人员对前端界面开发还是不熟悉的,前端页面要是要前端开发去做
如果动态的界面内容都是由后端模板生成, 就意味着前端开发人员要接触后端的模板,需要前端人员提供他们做好的HTML, 交给后端人员,再由后端人员把它修改成Django模板,这样会有很多问题
问题
1、不利于前后端开发任务的分离,前后端开发人员要做额外的沟通。2、如果前端除了web浏览器,还有手机APP的话, APP 不需要服务端返回HTML, 就得再开发一套数据接口3、渲染任务在后端执行,大大的增加了后端的性能压力。4、尤其是有的HTML页面很大, 当有大量的用户并发访问的时候, 后端渲染工作量很大,很耗费CPU 资源。
现在随着 浏览器中javascript 解释器性能的突飞猛进,以及一些前端模板库和框架的流行。很多架构师将 页面的html 内容生成 的任务放到前端,这样 服务端就只负责提供数据, 界面的构成全部在前端(浏览器前端或者手机前端)进行,称之为前端渲染。
注意
1、需要django返回的数据都是动态的,比如用户信息,药品信息,订单信息,等等这些数据都是通过去数据库查询而获取到的,2、静态数据,比如页面HTML文档、css文档、图片、视频这些数据不应该由django去返回的这些数据通常都是由其他的 静态资源服务软件,比如 Nginx、Varnish等等返回给前端这些软件都会有效的对静态数据进行缓存,大大提高服务效率相关文章:
Python 框架学习 Django篇 (三) 链接数据库
只要你是做后端开发的,那么就离不开各种数据库,Django框架对各种数据库都非常友好,比如常见的PostgreSQL、MySQL、SQLite、Oracle,django都对他们提供了统一调用api,我们这里主要使用mysql数据库作为演示 一、ORM机制 …...
【debug】安装diffusion的bug解决合集
环境问题 ImportError: cannot import name ‘CLIPImageProcessor’ from ‘transformers’ (D:\Python\lib\site-packages\transformers_init_.py) https://github.com/huggingface/transformers/issues/23340 解决:查看更详细信息,安装环境 transfor…...
面试题 01.02. 判定是否互为字符重排
题目来源: leetcode题目,网址:面试题 01.02. 判定是否互为字符重排 - 力扣(LeetCode) 解题思路: 遍历计数即可。 解题代码: class Solution { public:bool CheckPermutation(string s1, …...
笔记39:在Pycharm中为项目添加新解释器
很久不用pycharm都生疏了 a a a 第一步:创建虚拟环境 略 a a a 第二步:将虚拟环境应用到项目中去 【File】----【Settings】----【Project:~~~】-----【Project Interpreter】----【选择合适的解释器】 因为我们要用新的解释…...
C#—VB.NET的相同点与不同点
目录 前言 一、相同之处 二、不同之处 三、总结 前言 VB.NET 和C#是两种由微软公司开发的面向对象编程语言。它们在语法上有很多相似之处,但也有一些不同之处。本文将讨论 VB.NET 和C#之间的相同之处和不同之处。 一、相同之处 1.面向对象编程语言:…...
【Edabit 算法 ★☆☆☆☆☆】【返回数组第一个元素】 Return the First Element in an Array
【Edabit 算法 ★☆☆☆☆☆】【返回数组第一个元素】 Return the First Element in an Array arrays language_fundamentals Instructions Create a function that takes an array containing only numbers and return the first element. Examples getFirstValue([1, 2, 3…...
在Qt中怎么操作MySQL数据库
一、安装驱动 (1)安装 在Qt中操作MySQL数据库首先要安装mysql的驱动文件,将MySQL下的libmusql.dll文件复制到Qt的安装路径下的bin文件夹下即可。 本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(…...
C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)
目录 前言 一、网络的含义与构成 含义: 构成: 二、网络的体系结构 1>OSI七层模型 2>TCP/IP协议体系结构 3>数据经过体系结构,怎么封装? 4>端口号 5>大小端序 6>TCP/UDP传输层的协议 三、系统函数API学习框…...
chrome Driver 使用教程
ChromeDriver是一款实用的chrome浏览器驱动工具,能够用于自动化测试、网络爬虫和操作浏览器,其主要作用是模拟浏览器操作。 ## 下载地址 [Chrome for Testing availability](Chrome for Testing availability)...
目标检测YOLO实战应用案例100讲-面向恶劣环境下的多模态 行人识别
目录 前言 国内外研究现状 可见光行人目标识别 红外行人目标识别...
react-router-dom v6版本实现Tabs路由缓存切换
目录 文章目录 概要 效果 完整代码 概要 摆了半年摊,好久没写代码了,今天有人问我怎么实现React-Router-dom类似标签页缓存。后面看了一下router的官网。很久以前用的是react-router v5那个比较容易实现。v6变化挺大,但了解react的机制和rea…...
ArcGIS笔记9_数据源缺少空间参考信息?如何定义坐标系?
本文目录 前言Step 1 确定好要赋予给目标文件的恰当坐标系Step 2 定义坐标系 前言 有时从其他软件转换得到了shp文件,拖到ArcGIS后却出现“未知的空间参考:添加的数据源缺少空间参考信息 不能投影”的提示,如下图所示: 这种情况就…...
Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现
可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎,它还提供了分布式的多用户能力,实时的分析,以及对复杂搜索语句的处理能力,使其在众多场景下,如企业搜索,日志和事件数据分析等…...
离线语音与IoT结合:智能家居发展新增长点
离线语音控制和物联网(IoT)相结合在家居中具有广泛的应用和许多优势。离线语音控制是指在设备在本地进行语音识别和处理,而不需要依赖云服务器进行处理。IoT是指借助网络,通过手机APP、小程序远程控制家居设备。 启英泰伦基于AI语…...
STM32MP135和STM32MP157的区别
本文介绍了STMicroelectronics公司推出的两款多核处理器STM32MP135和STM32MP157之间的区别,包括主频、集成硬件模块数量、内存大小和电压调节模块等方面。 STMicroelectronics是一家领先的半导体解决方案提供商,在嵌入式系统领域有着丰富的经验。他们…...
微信小程序文本横向无缝滚动
背景: 微信小程序中列表宽度不够长,其中某字段显示不完整,因此要使其自动滚动。 (最初看网上很多用定时器实现,但他们的案例中都只是一个横幅、用定时器也无所谓。但是我的需求中是一个上下无限滚动的列表,…...
Layui 主窗口调用 iframe 弹出框模块,获取控件的相应值
var iframeWindow window[layui-layer-iframe index]; iframeWindow.layui.tree............(这里就可以操作tree里面的内容了)。var chrild layero.find(iframe).contents(); chrild.layui.tree (这样是调用不到的)。var child layer.getChildFrame(); child.layui.tree(这…...
镜头边缘的解析力通常比中心差很多的原因是什么?
1、问题背景 之前有总结过一篇文章,“ 相机出图画面一半清晰,一半模糊的原因是什么?”里面有描述到关于镜头边缘的清晰度通常比中心要差的原因主要是光的折射导致的,有读者指出问题,折射率是和传输介质相关࿰…...
“控制情绪,理性交流”刍议
今天,本“人民体验官”还是回避推广人民日报官方微博文化产品《走出低谷期的9个习惯》。 截图:来源“人民体验官”推广平台 之前,由于笔者读过《人民日报》曾经发表过的关于“学会管理情绪 ”的文章,对文章中这些观点深表认同&…...
UI基础之插画分类优漫动游
一、UI插画分类 UI基础之插画分类 1.扁平插画 优点∶快速上手,同时画风简洁明了,突出重 点,能够快速的让用户了解内容 缺点:过于简洁,运用的也比较普遍,视觉上难以让用户记住 2.肌理插…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

