测试开发之路--Flask 之旅 (三):数据库

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本文介绍了在 Flask 应用中实现权限管理的过程,包括使用 Flask-SQLAlchemy、Flask-MySQLdb、Flask-Security 和 Flask-Login 等扩展模块进行数据库配置与用户权限设置。首先创建数据库并定义用户、环境和角色模型,接着通过 Flask-Security 初始化用户和角色,并展示了如何便捷地管理权限。后续将深入探讨权限控制的具体应用。

来源:https://testerhome.com

背景

通过前两次的努力,我们对环境有了增删查改以及部署和查看日志的能力。 现在已经处于将就可用的状态。但其实还差了很重要的东西,就是权限的管理。 因为不能说每个用户上来都能随便的重启和删除环境吧,太容易出事故了。所以我们想起码有最基本的隔离性。

Flask扩展模块

上一次我们使用了Flask-WTF这个针对于表单的扩展模块。 这次为了加入权限管理,我们需要再安装以下这些扩展模块。

  • Flask-SQLAlchemy
  • Flask-MySQLdb
  • Flask-Security
  • Flask-Login

涉及到权限就需要有用户的概念,我们需要数据库来存储我们用户和环境的信息,所以要使用Flask-SQLAlchemy和Flask-MySQLdb(我使用的是mysql)。为了解决用户登录的问题引入Flask-Login, 为了生成角色和权限的概念引入Flask-Security。这里解释一下Flask-Security,它无法单独使用,更像是Flask-Login和Flask-SQLAlchemy的扩展。 是为了增强他们的权限控制能力而存在的。所以再加入Flask-Security后,Flask-SQLAlchemy和Flask-Login的使用方式都跟以前有些不太一样了。接下来我会一个一个介绍

创建数据库

我们先解决数据库的问题吧。 再安装好上面的所有模块后(注:缺一不可),我们首先要在数据库中创建名叫env的库。供我们使用

再启动app前设置一下数据库参数:

代码语言:javascript

复制

# 连接mysql数据库的配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@172.27.1.221:3306/env'

然后我们创建一个models.py

代码语言:javascript

复制

from __init__ import *
from flask_security import RoleMixin, UserMixin
# Create database connection object
db = SQLAlchemy(app)
# Define models
roles_users = db.Table('roles_users',
                       db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
                       db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))
class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))
class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))
    envs = db.relationship('Env', backref=db.backref('user'))
class Env(db.Model):
    def __init__(self, name, user_id):
        self.name = name
        self.user_id = user_id
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), unique=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

看到这么一坨代码可能有点懵逼。我来解释解释吧。 Flask-SQLAlchemy 是一个ORM框架,它组织了数据库表到类的影射。所以我们可以使用管理这些类对象的方式管理数据库。 你看到上面我们创建了 User,Env和Role 类,分别对应了用户,环境和角色。它们都集成了db.Model。我们把SQLAlchemy(app) 赋值给db,这是初始化我们数据库的方式。 然后你会发现User和Role又分别继承了UserMixin 和 RoleMixin。暂时可以不用管它, 这个是Flask-Security的东西。 表之间的关系我用外键来定义,额,虽然我知道外键的性能不好。开发人员几乎从来不用。但是我这么个小玩意就不在意这些有的没的了,一共就没几条数据。看到上面对roles_users的定义可能大家会觉得有点懵逼。 这是SQLAlchemy 处理多对多关系的方式:产生一张中间表。 SQLAlchemy处理表关系的方式就是relationship方法。这部分内容有点多~~ 具体详细的API定义请大家参考官方文档:http://www.pythondoc.com/flask-sqlalchemy/quickstart.html

接下来我们只需要调用下面的代码就会在数据库创建出这些表了。

代码语言:javascript

复制

db.create_all()

3张表加一个roles_users的表。

数据库操作

现在我们有表了,我们想初始化一些数据。 所以我们先看看一些基础的操作。 例如我们想创建一个环境信息,我们可以这么做:

代码语言:javascript

复制

env = Env()
env.name = 'test01'
env.user_id = '1'
db.session.add(env)
db.session.commit()

这是添加一条数据的方式。 只要是增删改的操作,只要没有运行db.session.commit(), 就不会真正的入库。 这是为了保证事务性。增加了一条数据后,现在我们来查询数据:

代码语言:javascript

复制

env = Env.query.filter_by(name='test01').first()

由于我们model的类都继承了db.Models。 所以我们可以使用一些方法来进行查询。 也可以使用一些复杂一点的查询方式,如下:

代码语言:javascript

复制

Env.query.filter(name.endswith('01')).all()

使用 Flask-Security 创建User和Role

OK,现在我们看看一开始没有说明的UserMixin 和 RoleMixin。上面说过他们是Flask-Security针对Flask-SQLAlchemy做的扩展。通过Flask-Security我们可以很方便的管理用户权限但是它对我们的model有一定的要求。请看下图:

就是说我们一定要有User和Role这两张表以及包含相应的字段。 这样Flask-Security才能够帮助我们生成权限管理的解决方案。举个简单的例子,通过使用Flask-Security, 我们可以用下面的方式创建用户:

代码语言:javascript

复制

from urls import db, User,  Role
from flask_security import SQLAlchemyUserDatastore, Security
# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)
db.create_all()
admin = user_datastore.create_user(email='admin@4paradigm.com', password='admin')
# 生成普通用户角色和admin用户角色
user_datastore.create_role(name='User', description='Generic user role')
admin_role = user_datastore.create_role(name='Admin', description='Admin user role')
# 为admin添加Admin角色
user_datastore.add_role_to_user(admin, admin_role)
db.session.commit()

上面是我初始化数据库的代码。 为了能使用Flask-Security。我们使用SQLAlchemyUserDatastore来封装db, 使用Security封装我们的web app。 接下来就可以看到我们使用很方便的方式创建user和role。 并且使用add_role_to_user的方式为一个用户添加角色。Flask-Security为我们提供了很多有用的方法。请看下面的截图:

更多的API请查看官方文档:https://pythonhosted.org/Flask-Security/api.html

未完待续

上面说的这些方法都可以很有效的管理我们数据库中User和Role的关系。再下一篇帖子中,我会详细介绍如何使用Flask-Security来做权限控制。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
JavaScript 前端开发 数据库
测试开发之路--Flask 之旅 (四):登录与权限控制
本文介绍了如何使用 Flask-Security 和 Flask-Login 实现权限管理和用户登录功能。首先讲解了 Flask 的消息闪现功能,用于向模板传递信息。接着介绍了如何利用 Flask-Security 的 `roles_required` 和 `roles_accepted` 装饰器保护页面,并展示了如何通过 `current_user` 获取当前用户信息。最后提到了使用 Flask-Login 时应避免升级至 0.4.0 版本,以防出现兼容性问题。通过这些技术,搭建了一个基本的用户权限管理系统。
130 6
测试开发之路--Flask 之旅 (四):登录与权限控制
|
3月前
|
JavaScript 前端开发 数据库
测试开发之路--Flask 之旅 (五):后台管理
本文介绍了如何使用 Flask-Admin 模块为应用添加后台管理功能,包括数据库表管理、自定义视图及服务器文件管理。通过实例展示了如何初始化 Flask-Admin,并实现对用户、角色等表的增删查改操作。此外,还介绍了如何定制视图及管理服务器上的配置文件。这一模块大大提升了应用的管理效率与灵活性。
75 5
测试开发之路--Flask 之旅 (五):后台管理
|
3月前
|
关系型数据库 MySQL 数据库
6-2|测试连接数据库的命令
6-2|测试连接数据库的命令
|
7月前
|
JavaScript Java 测试技术
大学生体质测试|基于Springboot+vue的大学生体质测试管理系统设计与实现(源码+数据库+文档)
大学生体质测试|基于Springboot+vue的大学生体质测试管理系统设计与实现(源码+数据库+文档)
115 0
|
3月前
|
关系型数据库 MySQL 测试技术
《性能测试》读书笔记_数据库优化
《性能测试》读书笔记_数据库优化
35 7
|
4月前
|
数据采集 数据可视化 关系型数据库
【优秀python web设计】基于Python flask的猫眼电影可视化系统,可视化用echart,前端Layui,数据库用MySQL,包括爬虫
本文介绍了一个基于Python Flask框架、MySQL数据库和Layui前端框架的猫眼电影数据采集分析与可视化系统,该系统通过爬虫技术采集电影数据,利用数据分析库进行处理,并使用Echart进行数据的可视化展示,以提供全面、准确的电影市场分析结果。
151 4
|
4月前
|
数据采集 数据可视化 前端开发
基于python flask的旅游数据大屏实现,有爬虫有数据库
本文介绍了一个基于Python Flask框架开发的旅游数据大屏系统,该系统集成了爬虫技术、数据库存储和ECharts数据可视化,提供了一个全面、实时更新的旅游信息展示平台,旨在提升旅游行业用户体验和决策效率。
|
4月前
|
数据可视化 搜索推荐 数据挖掘
基于Python flask 的数据可视化平台,可定制,可连接数据库
本文介绍了一个基于Python Flask框架开发的可定制数据可视化平台,该平台支持多种数据库连接,并提供丰富的图表类型和个性化设置,以实现交互式数据分析和展示。
基于Python flask 的数据可视化平台,可定制,可连接数据库
|
4月前
|
SQL 测试技术 数据库
Flask与SQLAlchemy的神秘力量:如何让你的数据库飞起来?
【8月更文挑战第31天】在现代Web开发中,Flask和SQLAlchemy是热门技术栈,前者是轻量级Web框架,后者为强大的ORM库。本文介绍如何在Flask项目中集成SQLAlchemy,通过示例展示数据库操作方法,并分享最佳实践,如熟悉ORM、编写测试及适度使用SQL语句,以提升开发效率和代码质量。
258 0
|
5月前
|
中间件 Java 测试技术
单元测试问题之编写单元测试时运行环境、数据库、中间件问题如何解决
单元测试问题之编写单元测试时运行环境、数据库、中间件问题如何解决