Python web 开发 flask 实践

news2024/11/24 13:35:04

1、前言

前文已经介绍了很多关于 python 的算法和脚本的写法,在本文将开启python的 web 的开发,和java 类似的,对于 web 开发也需要引入框架,对于 python 的 web 开发来说常见的有 flask 和 django 两种,在本文中将要介绍的是 flask 框架,相对来说起步简单一点儿。

2、环境准备

在开发之前,需要先安装 flask 的依赖,如下所示:

pip install flask 

案例中的项目使用的环境是 python3.8, 不同于 java, python 的环境会因为依赖产生各种各样的问题,为了保证环境的一致性,需要保证依赖的版本一致。那么如何保证环境和版本的一致呢?

# 通常采用 pip freeze 生成当前环境的所有依赖
pip freeze > requirements.txt
# 采用 pip install 来安装文件中的所有依赖
pip install -r requirements.txt
# 如果只安装本项目的依赖,则需要安装 pip install pipreqs
# 通过以下命令来生成项目依赖的版本
pipreqs . --encoding=utf8 --force

3、项目结构

对于web项目开发,也可以根据 mvc 的原则来划分项目,如下图所示:

1716821008493.png

  • model 模块用来存放数据库表对应的实体
  • script 模块用来存放数据库脚本和sh 脚本
  • static 是项目的静态文件,这里使用的是前端后端不分离的模式,所以有静态模块和html末班
  • templates html 模版文件
  • web 即存放控制器的模块
  • business 存放业务模块
  • app 项目启动的入口
  • utils 即项目木启动所需要的工具类

对于 web 项目的创建,可以使用 pycharm 中的新建项目模块完成项目的创建和基础配置,也可以手工创建文件的方式来创建项目。

1716824388507.png

4、项目app

flask 的入口文件为 app.py, 基础的配置以及依赖都在其中设置。这里通常配置 web 的访问和数据库的配置信息,还有项目的启动设置。

4.1 蓝图 Blueprint

通常情况下页面访问配置为 @app.route 即可访问,但是需要将页面路由的配置设置在 app.py 中,如果业务复杂或者路由过多的情况,就不太合适。通常在开发中可以使用蓝图来处理这类问题。

# 引入蓝图
from flask import Blueprint
# 注册蓝图,设置蓝图的名称,以及路径,url_prefix即访问前缀, 类似与spring controller 类上标注的 requestmapping。Login 为蓝图的名称,要唯一。
login_blue_print = Blueprint('Login', __name__, url_prefix="/login")

# 在使用蓝图时,需要使用的注解为 @login_blue_print.route 而非 app.route

1717932243771.png

4.2 数据库配置 sqlalchemy

对于数据库的配置,可以通过配置文件的方式来设置,具体的配置如下图所示:

# 配置方式
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
# 配置文件的方式
app.config.from_object(config)

1717944528756.png

对于数据库的操作,可以使用 pymysql 的方式来操作数据库,对于脚本来说是合适的,但是对于 web 开发来说,还是需要采用面向对象的方式,这里使用的 orm 框架是 SQLAlchemy , 对于 django 框架来说也是同样的。

1717944768099.png

数据库实体类需要集成db.Model, 在实体类中可以设置数据库的表名称,字段名称,类型,默认值,注释,主键,索引,约束键等信息。数据库采用的是下划线的命名方式,对应的实体是驼峰命名。

class User(db.Model):

    __tablename__ = "tb_user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='主键')
    userId = db.Column("user_id", db.String(32), default="", unique=True, comment='用户Id')
    username = db.Column(db.String(32), default="", comment='用户')
    email = db.Column(db.String(32), default="", nullable=False, comment='邮箱')
    cellphone = db.Column(db.String(32), default="", comment='手机号')
    status = db.Column(db.String(32), default="",  comment='状态')
    seq = db.Column(db.Integer, default="", comment='seq')
    createTime = db.Column("create_time", db.DateTime, default=datetime.now, comment='创建时间')
    updateTime = db.Column("update_time", db.DateTime, default=datetime.now, comment='更新时间')
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
4.3 热加载

在开发模式下,需要开启热加载的模式,方便开发的调试,通过以下的方式可以实现热加载。

1717948720300.png

5、数据库操作

数据库的操作是开展业务的核心,简单的说就是如何在 python 中实现数据的增删改查,sqlalchemy 这个 orm 框架如何实现数据的增删改查呢?

5.1 数据新增

对于数据新增的场景,需要先创建对象,然后需要将对象加入的当前会话中,并提交修改即可。

user = User()
user.username= "小明"
user.age = 34
# 单条保存
db.session.add(user)
# 多条保存
# db.session.add_all([user, user2, user3])
# 事务失败会自动回滚
db.session.commit()
5.2 数据查询

数据的查询种类比较多,具体如下所示

# 返回列表, 元素为模型对象
usr = User.query.all()
# 根据条件查询数据的数量
cnt = User.query.count()
print("cnt ", cnt)
# 根据查询第一条数据,根据年龄age和 userId 排序,默认排序为顺序排 desc
fst = User.query.order_by(User.age.asc(), User.userId.desc()).first()
print("user ", autils.trans_item(fst))
res_list = autils.trans_items(usr)
# 查询id = 10 的用户数据
us = User.query.get(10)

# 等值过滤器 关键字实参设置字段值,返回查询的对象
# BaseQuery对象可以续接其他过滤器/执行器  如 all/count/first等
User.query.filter_by(id=4).all()
# 复杂过滤器,参数为比较运算/函数引用等
User.query.filter(User.id == 4).first()

# 查询名字进行查询,字符串结束,开始,包含,最常用的还是 like 模糊查询
User.query.filter(User.username.endswith("李")).all()
User.query.filter(User.username.startswith("明")).all()
User.query.filter(User.username.contains("晓")).all()
User.query.filter(User.username.like("赵")).all()  # 模糊查询
# 根据名称和邮箱进行查询,且的关系
User.query.filter(and_(User.username.startswith('li'), User.email.startswith('li'))).all()
# 或的关系
User.query.filter(or_(User.age == 25, User.email.endswith("itheima.com"))).all()
# 根据id list 进行查询数据
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()
# 查询数据 offset limit 结合使用
User.query.order_by(User.age).offset(1).limit(4).all()

# 分页查询,查询第2页的数据,每页10个paginate(页码, 每页条数)
pn = User.query.paginate(page=2, per_page=10)
5.3 数据修改

对于数据的修改,需要先查询数据,然后修改完成之后进行保存即可。数据的修改有两种模式, 具体如下所示

# 1 执行查询语句, 获取目标模型对象
user = User.query.filter(User.id == 100).first()
# 2 对模型对象的属性进行赋值 (更新数据)
user.age = user.age + 1
# 3 提交会话
db.session.commit()

# 这里的修改传入的是一个字典,需要修改多个需要传入多个值即可。
User.query.filter(User.id = 1).update({'age': User.age - 1})
# 提交会话
db.session.commit()
5.4 数据删除

对于数据的删除,可以先查询后删除,也可以基于过滤条件的删除,和数据修改类似,具体如下所示:

# 1 执行查询语句, 获取目标模型对象
user = User.query.filter(User.id == 100).first()
# 2 删除数据
db.session.delete(user)
# 3 提交会话
db.session.commit()

# 这里可以根据多个过滤条件进行删除数据
User.query.filter(User.id = 1).delete()
# 提交会话
db.session.commit()

6、前端模块

这里使用的是前后端不分离的形式,如果使用前后端分离的方式,需要配置跨域:

from flask_cors import CORS
# 配置跨域 cors
cors = CORS(app, supports_credentials=True, resources=r'/*')

如果使用前后端不分离的方式,和 springmodel 类似,需要将参数传输到前端用于 html 的数据渲染。这里采用的是 flaskrender_template, 第一个参数是前端模版文件的名称,之后是在前端需要渲染的参数名以及参数值。

1717950216495.png

在前端渲染时,使用的方式和 jsp 类似,不过采用的是 {{}} 的方式来渲染参数,对于 for 循环和 if 条件判断也有类似的语法。

1717950143505.png

7、数据库连接池

前面讲述了如何使用 sqlalchemy 这个 orm 框架来查询数据,返回的对象需要经过转换才能返回到前端,在脚本中可以通过 dbutils.pooled_dbpymysql 进行包装来封装数据的操作。具体的操作如下所示:

import pymysql
from dbutils.pooled_db import PooledDB
# 声明数据库连接池
class DbPool(object):
    # 类变量数据库连接池
    __pool = None
    def __init__(self, db_config):
        # 构造函数,创建数据库连接、游标
        self.coon = DbPool.get_mysql_conn(db_config)
        self.cur = self.coon.cursor(cursor=pymysql.cursors.DictCursor)

    # 数据库连接池连接
    @staticmethod
    def get_mysql_conn(db_config):
        # 声明为全局变量
        global __pool
        if DbPool.__pool is None:
            __pool = PooledDB(creator=pymysql, mincached=1, maxcached=20, host=db_config['host'],
                              user=db_config['user'], passwd=db_config['passwd'], db=db_config['db'],
                              port=db_config['port'], charset=db_config['charset'])
        return __pool.connection()

    # 数据插入\更新\删除sql
    def op_update(self, sql, param):
        print('op_insert', sql, param)
        insert_num = self.cur.execute(sql, param)
        # commit 请求 
        self.coon.commit()
        return insert_num

    # 数据查询
    def op_query(self, sql, parm):
        print('op_select', sql, parm)
        self.cur.execute(sql, parm)  # 执行sql
        select_res = self.cur.fetchall()  # 返回结果为字典
        return select_res

    # 批量更新数据
    def op_update_list(self, list):
        sum = 0
        try:
            for tuple in list:
                sql, parm = tuple
                insert_num = self.cur.execute(sql, parm)
                if (insert_num == 0):
                    self.coon.rollback()
                    break
                sum += insert_num
            self.coon.commit()
        except:
            print('事务回滚')
            self.coon.rollback()
        return sum
        # 释放资源

    # 释放资源
    def dispose(self):
        self.coon.close()
        self.cur.close()
if __name__ == '__main__':
    # 数据库连接配置 
    db_config = {
        "host": 'localhost',
        "user": 'root',
        "passwd": '123456',
        "db": 'account',
        "port": 3306,
        "charset": 'utf8mb4'
    }

    db = DbPool(db_config)
    dt_list = db.op_query("select * from user where userid > %s order by userid desc limit 1", (23))
    for nd in dt_list:
        print(nd)

    res = db.op_update("update user set register_date = %s where userid > %s and userid < %s", ("2024-04-19 16:42:50", 17702, 17705))
    print("res is ", res)

8、总结

在本文中详细介绍了 flask 框架搭建 web 项目的全部流程以及注意事项,相对而言flask比较简单容易上手,主要是前端的配置和数据库的配置以及增删改查等操作。本文中所涉及的代码已经上传至 github, 欢迎交流学习。项目地址 flask_web。

作者:豫州牧
链接:https://juejin.cn/post/7382525876032552998

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

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

相关文章

Comparison method violates its general contract! 神奇的报错

发生情况 定位到问题代码如下&#xff08;脱敏处理过后&#xff09;&#xff0c;意思是集合排序&#xff0c;如果第一个元素大于第二个元素&#xff0c;比较结果返回1&#xff0c;否则返回-1&#xff0c;这里粗略的认为小于和等于是一样的结果 List<Integer> list Arr…

【Android14 ShellTransitions】(六)SyncGroup完成

这一节的内容在WMCore中&#xff0c;回想我们的场景&#xff0c;是在Launcher启动某一个App&#xff0c;那么参与动画的就是该App对应Task&#xff08;OPEN&#xff09;&#xff0c;以及Launcher App对应的Task&#xff08;TO_BACK&#xff09;。在确定了动画的参与者后&#x…

C#.net6.0语言+B/S架构+前后端分离 手术麻醉信息管理系统源码

C#.net6.0语言&#xff0b;B/S架构前后端分离 手术麻醉信息管理系统源码 什么是手术麻醉信息管理系统 满足医院等级评级需求 满足电子病历评级需求 满足科室需求 术前 1、患者术前评估/诊断 2、术前讨论制定手术方案 3、手术准备 4、术前准备 术中 1、送手术室 2、麻…

openlayers 轨迹回放(历史轨迹),实时轨迹

本篇介绍一下使用openlayers轨迹回放&#xff08;历史轨迹&#xff09;&#xff0c;实时轨迹 1 需求 轨迹回放&#xff08;历史轨迹&#xff09;实时轨迹 2 分析 主要是利用定时器&#xff0c;不断添加feature 轨迹回放&#xff08;历史轨迹&#xff09;&#xff0c;一般是…

Ubuntu安装qemu-guest-agent

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 Ubuntu-24.04-live-server-amd64启用ssh Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、安装二、启用服务三、效果总结 前言 QEMU Guest Agent&#xff08;简称QEMU GA或QGA&#xff09;在虚拟…

什么是NLP-自然语言处理

什么是NLP-自然语言处理 什么是NLP开通NLP新建项目创建模型 什么是NLP NPL是面向算法小白用户的行业自适应标注、训练和服务平台。该产品支持文本实体抽取、文本分类、关键短语抽取、情感分析、关系抽取、短文本匹配、商品评价解析等 NLP 定制化算法能力&#xff0c;用户无需拥…

御龙掘宝挂机零撸修仙类游戏定制开发源码部署

随着移动游戏的普及&#xff0c;御龙掘宝挂机零撸修仙类游戏定制开发源码部署应运而生。这款游戏结合了传统的修仙元素、挂机游戏的核心玩法以及零撸掘金的商业模式&#xff0c;为玩家提供了一个全新的游戏体验。本文将探讨御龙掘宝挂机零撸修仙类游戏定制开发源码部署的核心技…

linux 安装sftp及使用sftp工具类上传和下载

一、centos7 安装sftp 1.安装 OpenSSH 服务&#xff1a; sudo yum install openssh-server2.启动 SSH 服务&#xff0c;并设置为开机启动&#xff1a; sudo systemctl start sshd sudo systemctl enable sshd3.创建一个新用户&#xff0c;用于SFTP连接&#xff08;替换your_…

Linux:多线程中的互斥与同步

多线程 线程互斥互斥锁互斥锁实现的原理封装原生线程库封装互斥锁 死锁避免死锁的四种方法 线程同步条件变量 线程互斥 在多线程中&#xff0c;如果存在有一个全局变量&#xff0c;那么这个全局变量会被所有执行流所共享。但是&#xff0c;资源共享就会存在一种问题&#xff1…

Ilya出走记:SSI的超级安全革命

图片&#xff5c;OpenAI官网 ©自象限原创 作者丨罗辑、程心 和OpenAI分道扬镳以后&#xff0c;Ilya“神秘而伟大”的事业终于揭开了面纱。 6月20日&#xff0c;前OpenAI核心创始人 Ilya Stuskever&#xff0c;在官宣离职一个月后&#xff0c;Ilya在社交媒体平台公开了…

opencascade AIS_InteractiveContext源码学习2

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…

神经网络学习5-非线性激活

非线性激活&#xff0c;即 这是最常用的 inplaceTrue 原位操作 改变变量本身的值&#xff0c;就是是否输入时若原本有值&#xff0c;是否更换 该函数就是表示&#xff1a;输入小于零时输出0&#xff0c;大于零时保持不变 代码如下&#xff1a; import torch from torch imp…

芋道源码 yudao-cloud 、Boot 文档,开发指南 看全部,破解[芋道快速开发平台 Boot + Cloud]

1、文档全部保存本地部署查看&#xff0c;真香 文档已抓取最新版本&#xff0c;2024.06.21。【唯一遗憾&#xff0c;表结构到2024.04月&#xff0c;已被限制放到知识星球】会员中心&#xff0c;支付中心&#xff0c;CRM&#xff0c;ERP&#xff0c;商城&#xff0c;公众号运行…

利氪科技拿下C轮超级融资,国产智能底盘黑马奔向黄金时代

“智能驾驶遗珠&#xff0c;国产替代富矿。” 这是海通证券在最近一期研报中&#xff0c;描述线控底盘产业的用语。它很巧妙地点明了&#xff0c;这个藏在车身之下的部分&#xff0c;拥有何种特征——稳坐技术体系的核心点位&#xff0c;拥有前景广阔的市场。 事实上&#xf…

生成式AI与开发者:威胁还是机遇?

近期&#xff0c;围绕生成式人工智能&#xff08;AI&#xff09;是否能取代程序员的讨论达到了前所未有的高度。百度的创始人李彦宏甚至预言&#xff0c;未来可能不再需要程序员这一职业。这个话题让很多开发者&#xff0c;包括有几年开发经验的我&#xff0c;感到不安。我记得…

【ArcGIS微课1000例】0120:ArcGIS批量修改符号的样式(轮廓)

ArcGIS可以批量修改符号的样式,如样式、填充颜色、轮廓等等。 文章目录 一、加载实验数据二、土地利用符号化三、批量修改符号样式四、注意事项一、加载实验数据 订阅专栏后,从私信查收专栏配套的完整实验数据包,打开0120.rar中的土地利用数据,如下图所示: 查看属性表: …

Python Web实战:Python+Django+MySQL实现基于Web版的增删改查

项目实战 1.创建项目(sms) File->New Project->Django 稍等片刻&#xff0c;项目的目录结构如下图 项目创建后确认是否已安装Django和mysqlclient解释器&#xff0c;如何确认&#xff1f;file->Settings 如果没有请在Terminal终端输入以下命令完成安装 pip instal…

德璞资本:科技股波动解析,三巫日与日元效应下的市场走向

摘要 近期&#xff0c;美国科技股的表现令人担忧&#xff0c;标普500指数在科技股的拖累下出现下跌。亚洲股市也受到影响&#xff0c;特别是日本和韩国股市。随着期权到期日的临近&#xff0c;市场面临更大的波动风险。本文将详细分析科技股失去动能的原因、三巫日的影响及未来…

elementui组件库实现电影选座面板demo

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Cinema Seat Selection</title><!-- 引入E…

华为重磅官宣:超9亿台、5000个头部应用已加入鸿蒙生态!人形机器人现身 专注AI芯片!英伟达挑战者Cerebras要上市了

内容提要 华为表示&#xff0c;盘古大模型5.0加持&#xff0c;小艺能力全新升级。小艺智能体与导航条融为一体&#xff0c;无处不在&#xff0c;随时召唤。只需将文字、图片、文档“投喂”小艺&#xff0c;即可便捷高效处理文字、识别图像、分析文档。 正文 据华为终端官方微…