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等等返回给前端这些软件都会有效的对静态数据进行缓存,大大提高服务效率

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

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

相关文章

10月20日星期五今日早报简报微语报早读

10月20日星期五&#xff0c;农历九月初六&#xff0c;早报微语早读分享。 1、上海4岁走失女童遗体在宁波市某滩涂被发现&#xff0c;排除刑事案件&#xff1b; 2、中国多个实体和个人被指涉伊朗军工制造将遭美国非法单边制裁&#xff0c;外交部&#xff1a;坚决反对&#xff…

2.3 如何使用FlinkSQL读取写入到JDBC(MySQL)

1、JDBC SQL 连接器 FlinkSQL允许使用 JDBC连接器&#xff0c;向任意类型的关系型数据库读取或者写入数据 添加Maven依赖 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-jdbc</artifactId><version>3.1…

【高危安全通告】Oracle 10月月度安全漏洞预警

近日&#xff0c;安全狗应急响应中心关注到Oracle官方发布安全公告&#xff0c;共披露出在Oracle Weblogic中存在的6个高危漏洞。 漏洞描述 CVE-2023-22069&#xff1a;Oracle Weblogic 远程代码执行漏洞 Oracle WebLogic Server存在远程代码执行漏洞&#xff0c;该漏洞的CVS…

如何写代码实现VRP问题中车辆容量限制及时间窗要求(python)

问题研究背景 使用遗传模拟退火算法求解如下10个卸货点的VRPTW问题。为了使研究的问题更加有意义&#xff0c;本人将时间限理解为服务点一天的具体可以允许配送的时间。 如果不要求车辆从配送中心出发的时间是统一的并且为0时刻&#xff0c;那么就默认第一个配送节点是一定能赶…

用echarts在vue2中实现3d饼图

先看效果&#xff0c;再看文章&#xff1a; 一、安装插件 3d的图不仅用到echarts&#xff0c;还用到了echarts-gl&#xff0c;因此都需要安装一下哦~ npm install echarts npm install echarts-gl2.0.9 //可以指定版本&#xff0c;也可不指定二、在main.js中引入 import * …

达索智能制造解决方案,敏捷电芯制造如何赋能企业竞争力 | 百世慧®

敏捷电芯制造赋能企业竞争力 全球电池市场正在快速扩大&#xff0c;为制造商带来巨大商机。 锂电行业的智能制造如何应用&#xff1f; 电池制造业的市场趋势是什么&#xff1f; 电池制造商面临哪些挑战&#xff1f; 特别是电池电芯制造方面&#xff0c;如何克服挑战获得竞…

竞赛 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

微信小程序 —— 会议OA项目首页布局与Mock数据交互

14天阅读挑战赛如果世界上有奇迹&#xff0c;那一定是努力的另一个名字。 目录 一、小程序布局 1.1 Flex布局 1.2 Flex属性 二、OA会议首页搭建 2.1 首页底部菜单 2.2 创建后端结口 2.3 Mock模拟数据 2.4 首页轮播图搭建 2.5 首页内容搭建 一、小程序布局 1.1 Flex布…

产品新闻稿撰写流程是怎样的,纯干货

企业和品牌每年都会投放大量的产品新闻稿&#xff0c;一篇优质的产品新闻稿可以掀起更多的关注&#xff0c;收获更多的流量&#xff0c;如何在众多的新闻稿中脱颖而出&#xff0c;吸引读者的注意力&#xff1f;本文伯乐网络传媒将为您揭秘产品新闻稿撰写流程&#xff0c;教您如…

基于epoll封装非阻塞的reactor框架(附源码)

C++常用功能源码系列 文章目录 C++常用功能源码系列前言一、reactor架构二、client端reactor代码三、server端reactor代码四、单reactor架构可以实现百万并发总结前言 本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项…

学会C++之后,为什么学任何语言都会更加容易?

学会C之后&#xff0c;为什么学任何语言都会更加容易&#xff1f; 编程的本质是把自然语言翻译为机器语言&#xff0c;但机器没有联想力&#xff0c;所以它需要编写者事无巨细地告诉它怎么做。最近很多小伙伴找我&#xff0c;说想要一些c语言资料&#xff0c;然后我根据自己从业…

什么是美颜sdk?直播实时美颜sdk的工作流程和架构分析

在现代社交媒体和娱乐行业中&#xff0c;直播已经成为了一种受欢迎的娱乐形式&#xff0c;同时实时美颜也变得越来越重要。直播实时美颜SDK的工作流程和架构在这一领域起到了关键作用。本文将深入探讨这些SDK的内部机制&#xff0c;从而理解它们如何为用户提供出色的美颜效果。…

Pytest测试框架搭建的关键6个知识点(建议收藏)

在现代软件开发中&#xff0c;测试是确保代码质量和功能稳定性的关键步骤。而Pytest作为一个功能强大且易于使用的Python测试框架&#xff0c;为我们提供了一个优雅的方式来编写和管理测试。本文将为你介绍如何构建高效可靠的测试环境&#xff0c;着重探讨Pytest测试框架搭建时…

LinkedList 源码解析(JDK1.8)

目录 一. 前言 二. 常用方法 三. 源码解析 3.1. 属性和内部类 3.2. 构造函数 3.3. 添加元素 3.4. 获取元素 3.5. 删除元素 3.6. 迭代器 3.6.1. 头到尾方向的迭代 3.6.2. 尾到头方向的迭代 3.6.3. add() 插入元素 3.6.4. remove() 移除元素 一. 前言 LinkedList同时…

TS使用echarts柱状图鼠标放上去并弹出

效果 代码 <template><div><Chart style"width: 100%; height: 344px" :option"chartOption" /></div> </template><script lang"ts" setup>import { ref } from vue;import { ToolTipFormatterParams } f…

Keeplived安装部署(单机双机)

Keeplived官网&#xff1a;https://www.keepalived.org/download.html 一 单机安装配置: 1.上传keepalived安装包并且安装 [rootmaster1 local]# tar -zxvf keepalived-2.2.8.tar.gz [rootmaster1 local]# mv keepalived-2.2.8 keepalived [rootmaster1 local]# chown root:r…

智能井盖是什么?万宾科技智能井盖传感器有什么特点

智能井盖是一种基于物联网和人工智能技术的新型城市设施。它不仅具备传统井盖的功能&#xff0c;还能通过数字化、自动化的方式实现远程监控和智能管理&#xff0c;提升城市运行效率和服务水平。 WITBEE万宾智能井盖传感器EN100-C2是一款井盖异动监测的传感终端。对窨井盖状态(…

分享一下微信公众号抽奖活动怎么弄

微信公众号抽奖活动是一种非常有效的营销手段&#xff0c;可以吸引大量用户参与&#xff0c;提高品牌曝光度和用户粘性。下面将介绍如何策划和实施一个成功的微信公众号抽奖活动。 一、明确活动目的 首先&#xff0c;需要明确微信公众号抽奖活动的目的。通常&#xff0c;抽奖活…

同花顺动态Cookie反爬JS逆向分析

文章目录 1. 写在前面2. 请求分析3. Hook Cookie4. 补环境 1. 写在前面 最近有位朋友在大A失意&#xff0c;突发奇想自己闲来无事想要做一个小工具&#xff0c;监测一下市场行情的数据。自己再分析分析&#xff0c;虽是一名程序员但苦于对爬虫领域相关的技术不是特别熟悉。最后…

万宾科技智能井盖传感器特点介绍

当谈论城市基础设施的管理和安全时&#xff0c;井盖通常不是第一项引人注目的话题。然而&#xff0c;传统井盖和智能井盖传感器之间的差异已经引起了城市规划者和工程师的广泛关注。这两种技术在功能、管理、安全和成本等多个方面存在着显著的差异。 WITBEE万宾智能井盖传感器E…