Flask笔记三之连接使用数据库

本文首发于公众号:Hunter后端

原文链接:Flask笔记三之连接使用数据库

这一节介绍 Flask 与数据库的连接,以及接口里查询数据的操作。

这里使用的是 SQLAlchemy + pymysql 实现与数据库的连接,SQLAlchemy 的详细介绍见之前的笔记有过一篇基础的介绍,这里只介绍与 Flask 的嵌入使用。

本篇笔记的代码都已经提交到 github 上,可使用下面的操作获取代码:

git clone https://github.com/x1204604036/flask_backend.git

以下是本篇笔记目录:

  1. 安装依赖
  2. 定义和连接数据库
  3. 接口使用数据库

0、安装依赖

安装相关依赖:

pip3 install sqlalchemy==2.0.19
pip3 install pymysql==1.1.0

1、定义和连接数据库

首先,在 app/config/development.py 里定义我们的数据库相关变量,内容如下:

# app/config/development.pyMYSQL_CONNECT_TYPE = "mysql+pymysql"
MYSQL_USERNAME = "root"
MYSQL_PASSWORD = "123456"
MYSQL_HOST = "192.168.1.3"
MYSQL_PORT = 3306
MYSQL_DB_NAME = "flask_db"

接下来定义 user 相关的 model,在 app/ 文件夹下创建一个 models/ 文件夹,其下创建一个 user.py 文件,内容如下:

# app/models/user.pyfrom sqlalchemy import Column, Integer, String
from app.database import Baseclass User(Base):__tablename__ = "user"id = Column(Integer, primary_key=True, autoincrement=True)username = Column(String(50), unique=True)email = Column(String(120), default="", comment="邮箱")password = Column(String(120))

在 app/ 文件夹下创建一个文件 database.py,其内容如下:

# app/database.py from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from app.config import configengine_str = "%s://%s:%s@%s:%s/%s?charset=utf8" % (config.MYSQL_CONNECT_TYPE,config.MYSQL_USERNAME,config.MYSQL_PASSWORD,config.MYSQL_HOST,config.MYSQL_PORT,config.MYSQL_DB_NAME,
)engine = create_engine(engine_str)db_session = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine,)
)Base = declarative_base()
Base.query = db_session.query_property()def init_db(app):import app.models.userBase.metadata.create_all(bind=engine)

在这里,从 config 配置文件中获取 MySQL 的连接信息,然后创建 engine

最后定义一个初始化数据库的函数,用于创建所有定义了的数据库模型,在这里是引入了 User 这个 model

然后在 app/init.py 里引入数据库,文件内容如下:

# app/__init__.pyfrom flask import Flaskdef create_app():app = Flask(__name__)app.config.from_object("app.config.config")app.secret_key = b'f0e97d3012eed1c2939ac1a62ce1e8d455e86fa9da47b26c94a9af4119be29d6'from . import databasedatabase.init_db(app)from .user import bp_userapp.register_blueprint(bp_user.bp)return app

启动 Flask 服务,运行 flask run,就可以看到对应的数据库下多了我们创建的 user 表了。

接下来,我们改写上一篇笔记中的接口定义,从数据库中获取数据

2、接口使用数据库

以下是 app/user/bp_user.py 的内容:

from flask import Blueprint, request, session, jsonify
from werkzeug.security import generate_password_hash, check_password_hash
from app.models.user import User
from app.database import db_sessionbp = Blueprint("user", __name__, url_prefix="/user")@bp.route("/register", methods=("POST",))
def register():request_json = request.jsonusername = request_json.get("username")password = request_json.get("password")email = request_json.get("email")if not username or not password or not email:return {"code": -1, "msg": "请传递用户名、密码、邮件等必要信息"}user = User.query.filter(User.username == username, User.email == email).first()if user:return {"code": -1, "msg": "用户已存在"}new_user = User(username=username,email=email,password=generate_password_hash(password))db_session.add(new_user)db_session.commit()return {"code": 0, "msg": "注册成功"}@bp.route("/login", methods=("POST",))
def login():username = request.form.get("username")password = request.form.get("password")if not username or not password:return {"code": -1, "msg": "请上传用户名和密码"}user = User.query.filter(User.username == username).first()if not user:return {"code": -1, "msg": "用户不存在"}if not check_password_hash(user.password, password):return {"code": -1, "msg": "密码验证失败"}session.clear()session["user_id"] = user.idreturn {"code": 0, "msg": "success"}def login_required(func):def wrapped(*args, **kwargs):if session.get("user_id") is None:return jsonify({"code": -1, "msg": "请先登录系统"}), 401return func(*args, **kwargs)return wrapped@bp.route("/logout", methods=("POST",))
def logout():session.clear()return {"code": 0, "msg": "logout success"}@bp.route("/user_info", methods=("POST",))
@login_required
def get_user_info():user_id = session.get("user_id")user_info = {"user_id": user_id}return {"code": 0, "msg": "success", "user_info": user_info}

在这里实现了四个接口:

  1. /register 为注册接口,用于注册用户
  2. /login 为登录接口,记录了登录信息
  3. /user_info 为获取用户信息接口,使用到自己写的一个需要登录的装饰器
  4. /logout 为登出接口

以上就完成了 Flask 连接使用数据库的示例。

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

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

相关文章

蓝桥杯2021年5月青少组Python程序设计国赛真题

30 个人在一条船上,超载,需要 15 人下船于是人们排成一队,排队的位置即为他们的编号。报数,从1开始,数到9的人下船。如此循环,直到船上仅剩15 人为止,问都有哪些编号的人下船了呢? 2】判断101-200之间有多少个素数,并输出所有素数…

Maven上传Jar到Nexus远程仓库的两种方式

Maven上传Jar到Nexus远程仓库的两种方式 文章目录 前言通过mvn clean deploy指令上传第一步 配置maven的setting.xml文件第二步 配置pom文件第三步 执行打包指令 手动上传 jar到远程仓库第一步 配置setting文件第二步 执行上传命令 前言 各个公司在开发项目时,一般…

Linux C/C++并发编程实战(8)CAS机制的ABA问题

文章目录 无锁队列中的ABA问题ABA问题解决方案 ABA问题:CAS在操作的时候会检查变量的值是否被更改过,如果没有则更新值,但是带来一个问题,最开始的值是A,接着变成B,最后又变成了A。经过检查这个值确实没有修…

Leetcode每日一题

https://leetcode.cn/problems/binary-tree-preorder-traversal/ 这道题目需要我们自行进行创建一个数组,题目也给出我们需要自己malloc一个数组来存放,这样能达到我们遍历的效果,我们来看看他的接口函数给的是什么。 可以看到的是这个接口函…

说说webpack中常见的loader?解决了什么问题?

在Webpack中,Loader是用于处理各种文件类型的模块加载器,它们用于对文件进行转换、处理和加载。常见的Loader解决了以下问题: 处理 JavaScript 文件:Babel Loader用于将最新的JavaScript语法转译为浏览器兼容的版本,以…

5_CSS三大特性盒子模型

第5章-盒子模型【比屋教育】 本课目标(Objective) 掌握CSS三大特性理解什么是盒子模型掌握内边距padding的用法掌握外边距margin的用法 1. CSS的层叠,继承,优先级 1.1 CSS层叠 层叠:是指多个CSS样式叠加到同一个元…

Web(8)SQL注入

Web网站(对外门户) 原理:not>and>or(优先级) 一.低级注入 order by的作用是对字段进行排序,如order by 5,根据第五个字段 进行排序,如果一共有4个字段,输入order by 5系统就会报错不 …

详细介绍开源固件-TF-A

什么是TF-A? TF-A(Trusted Firmware-A)是一种用于嵌入式系统的开源固件,而不是Linux的一部分。TF-A主要用于ARM架构的处理器和设备,它提供了一组安全和可信任的软件组件,用于引导和初始化系统。 如下是其…

GD32F30X-RT-Thread学习-线程管理

1. 软硬件平台 GD32F307E-START Board开发板MDK-ARM Keil 2.RT-Thread Nano 3.RT-Thread 内核学习-线程管理 ​ 在多线程操作系统中,可以把一个复杂的应用分解成多个小的、可调度的、序列化的程序单元,当合理地划分任务并正确地执行时,这…

qt可以详细写的项目或技术

1.QT 图形视图框架 2.QT 模型视图结构 3.QT列表显示大量信息 4.QT播放器 5.QT 编解码 6.QT opencv

Linux--RedHat--安装和配置C++环境

百度下载,安装包: 链接:https://pan.baidu.com/s/1IgBfCCRxGYZ_PPiedad0xQ 提取码:ffff 下载后,建个目录,先解压好安装包! (两种方法)执行如下命令: 参考…

Bypass open_basedir

讲解 open_basedir是php.ini中的一个配置选项,可用于将用户访问文件的活动范围限制在指定的区域。 假设open_basedir/var/www/html/web1/:/tmp/,那么通过web1访问服务器的用户就无法获取服务器上除了/var/www/html/web1/和/tmp/这两个目录以外的文件。…

Java——面试:String 和 StringBuffer 的区别?

相同点: String 和 StringBuffer,它们可以储存和操作字符串, 即包含多个字符的字符数据。 String 和 StringBuffer 的区别有以下几点: 1.String 类提供了数值不可改变的字符串。而 StringBuffer 类提供的字符串进行修改。 当你知…

洛谷 P8674 [蓝桥杯 2018 国 B] 调手表

文章目录 [蓝桥杯 2018 国 B] 调手表题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题意解析CODE分析一下复杂度 [蓝桥杯 2018 国 B] 调手表 题目描述 小明买了块高端大气上档次的电子手表,他正准备调时间呢。 在 M78 星云,时间的计量…

JVM虚拟机:命令行查看JVM垃圾回收器的执行信息

在eclipse中打开命令行窗口 window->show view->Terminal 这样就打开了Terminal窗口,效果如下所示: java -XX:PrintCommandLineFlags -version 这个命令可以查看一些配置信息,其中最重要的配置信息就是,当前使用的G1回收器…

什么是漏洞扫描

漏洞扫描是指基于漏洞数据库,通过扫描等手段对指定的远程或者本地计算机系统的安全脆弱性进行检测,发现可利用漏洞的一种安全检测的 行为,也是一类重要的网络安全技术。它和防火墙、入侵检测系统互相配合,能够有效提高网络的安全性…

键盘打字盲打练习系列之成为大师——5

一.欢迎来到我的酒馆 盲打,成为大师! 目录 一.欢迎来到我的酒馆二.关于盲打你需要知道三.值得收藏的练习打字网站 二.关于盲打你需要知道 盲打系列教程,终于写到终章了。。。一开始在看网上视频,看到up主熟练的打字技巧&#xff…

LabVIEW与Tektronix示波器实现电源测试自动化

LabVIEW与Tektronix示波器实现电源测试自动化 在现代电子测试与测量领域,自动化测试系统的构建是提高效率和精确度的关键。本案例介绍了如何利用LabVIEW软件结合Tektronix MDO MSO DPO2000/3000/4000系列示波器,开发一个自动化测试项目。该项目旨在自动…

javascript中Reflect是什么?三分钟初识

目录 1. Reflect是什么?2. 为什么会出现Reflect?3. 需要怎么去使用Reflect?4. 最终的结果解决什么?5. 使用的注意点6. 常用的技巧 Reflect是Javascript中的一个内置对象,它提供了一组用于操作对象的方法,可…

Spring - BeanFactory和FactoryBean的理解

BeanFactory是什么? BeanFactory是Spring 容器的根接口,它是IOC的基本容器,负责管理和加载Bean,它为具体的IOC容器提供了最基本的规范,比如DefaultListableBeanFactory和ConfigurableBeanFactory,BeanFact…