安全检测系统 03_Flask基础框架构建,SQLAlchemy映射构建

第一部分:Flask框架搭建

一 、创建默认配置对象类:

创建Flask app的时候从默认配置对象类中加载数据库的连接信息

1.common/settings/default.py
class DefaultConfig(object):
    """
    Flask默认配置
    """
    ERROR_404_HELP = False
    # 日志
    LOGGING_LEVEL = 'DEBUG'
    LOGGING_FILE_DIR = '/home/python/diagnosis/logs'
    LOGGING_FILE_MAX_BYTES = 300 * 1024 * 1024
    LOGGING_FILE_BACKUP = 10

    # flask-sqlalchemy使用的参数
    # SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1/monitor'  # 数据库
    SQLALCHEMY_BINDS = {
        'bj-m1': 'mysql://root:mysql@127.0.0.1:3306/monitor',
        'bj-s1': 'mysql://root:mysql@127.0.0.1:8306/monitor',
        'masters': ['bj-m1'],
        'slaves': ['bj-s1'],
        'default': 'bj-m1'
    }
    SQLALCHEMY_TRACK_MODIFICATIONS = False  # 追踪数据的修改信号
    SQLALCHEMY_ECHO = True

二、创建sqlAlchemy的db对象:db对象绑定多个数据库

2.1 common/models/db_routing/routing_sqlalchemy.py

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import orm
import random

from .session import RoutingSession


class RoutingSQLAlchemy(SQLAlchemy):
    """
    自定补充数据库路由的SQLAlchemy
    """
    master_binds = []
    slave_binds = []
    default_bind = ''

    def create_session(self, options):
        return orm.sessionmaker(class_=RoutingSession, db=self, **options)

    def get_binds(self, app=None):
        app = self.get_app()
        config_binds = app.config.get('SQLALCHEMY_BINDS')
        if not config_binds:
            raise RuntimeError('Missing SQLALCHEMY_BINDS config.')

        self.master_binds = list(config_binds.get('masters') or ())
        self.slave_binds = list(config_binds.get('slaves') or ())
        self.default_bind = config_binds.get('default')

        binds = self.master_binds + self.slave_binds
        for bind in binds:
            self.get_engine(app, bind)

        return {}

    def get_bind_for_write(self):
        """
        获取写使用的数据库
        """
        return random.choice(self.master_binds)

    def get_bind_for_read(self):
        """
        获取读使用的数据库
        """
        return random.choice(self.slave_binds)

2.2 common/models/db_routing/session.py

from flask_sqlalchemy import SignallingSession, get_state

class RoutingSession(SignallingSession):
    """
    补充路由的session
    """
    def __init__(self, db, bind_name=None, autocommit=False, autoflush=True, **options):
        self._name = bind_name
        SignallingSession.__init__(self, db, autocommit=autocommit, autoflush=autoflush, **options)

    def get_bind(self, mapper=None, clause=None):
        """
        获取数据库绑定
        """
        # For tests
        print('Calling get_bind: _name={}'.format(self._name))

        state = get_state(self.app)

        if self._name:
            # 指定
            print('Using DB bind: _name={}'.format(self._name))
            return state.db.get_engine(self.app, bind=self._name)
        else:
            # 默认数据库
            print('Using default DB bind: _name={}'.format(state.db.default_bind))
            return state.db.get_engine(self.app, bind=state.db.default_bind)

    def set_to_write(self):
        """
        设置用写数据库
        """
        state = get_state(self.app)

        self._name = state.db.get_bind_for_write()

    def set_to_read(self):
        """
        设置用读数据库
        """
        state = get_state(self.app)

        self._name = state.db.get_bind_for_read()

 2.3  common/models/__init__.py  创建db对象

# from flask_sqlalchemy import SQLAlchemy
from .db_routing.routing_sqlalchemy import RoutingSQLAlchemy
db = RoutingSQLAlchemy()

2.4  补充设置:

在进行编写3.1之前需要设置:

2.4.1 将common文件夹设置为导包路径

2.4.2 是否允许运行环境中的配置文件覆盖已加载的配置信息(配置对象)common/utils/constants.py

# 配置文件环境变量名
GLOBAL_SETTING_ENV_NAME = 'monitor_WEB_SETTINGS'

三、创建Flask的应用对象 app,加载默认的配置文件;采用 db.init_app(app)进行MySQL数据库连接初始化

3.1 monitor/__init__.py

from flask import Flask


def create_flask_app(config, enable_config_file=False):
    """
    创建Flask应用
    :param config: 配置信息对象
    :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息
    :return: Flask应用
    """
    app = Flask(__name__)
    app.config.from_object(config)  #1 从配置对象中加载配置文件
    if enable_config_file:
        from utils import constants
        app.config.from_envvar(constants.GLOBAL_SETTING_ENV_NAME, silent=True)
    return app

def create_app(config,enable_config_file=False):
    """
    创建应用
    :param config: 配置信息对象
    :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息
    :return: 应用
    """
    app=create_flask_app(config,enable_config_file)

    # 配置日志

    # MySQL数据库连接初始化
    from models import db
    db.init_app(app)
    # 注册蓝图

    return app

四、创建main文件 作为统一的启动路径:访问 / 地址 以Json的方式返回应用内的所有路由信息

4.1 monitor/main.py

import sys
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(BASE_DIR, 'common'))

from flask import jsonify
from . import create_app
from settings.default import DefaultConfig

app = create_app(DefaultConfig, enable_config_file=True)

@app.route('/')
def route_map():
    """
    主视图,返回所有视图网址
    """
    rules_iterator = app.url_map.iter_rules()
    return jsonify(
        {rule.endpoint: rule.rule for rule in rules_iterator })
    # return jsonify({rule.endpoint: rule.rule for rule in rules_iterator if rule.endpoint not in ('route_map', 'static')})
# {"user.Authorization":"/v1_0/authorizations","user.Photo":"/v1_0/user/photo","user.SMSVerificationCode":"/v1_0/sms/codes/<mobile:mobile>"}

4.2 Flask应用测试

4.2.1 运行方式配置

 

 运行

访问:

第二部分:SQLAlchemy

1.安装

安装Flask-SQLAlchemy

pip install flask-sqlalchemy

如果使用的是MySQL数据库,还需要安装MySQL的Python客户端库

pip install mysqlclient

2 数据库连接设置

在Flask中使用Flask-SQLAlchemy需要进行配置,主要配置以下几项:

  • SQLALCHEMY_DATABASE_URI 数据库的连接信息

    • Postgres:

      postgresql://user:password@localhost/mydatabase
      
    • MySQL:

      mysql://user:password@localhost/mydatabase
      
    • Oracle:

      oracle://user:password@127.0.0.1:1521/sidname
      
    • SQLite (注意开头的四个斜线):

      sqlite:absolute/path/to/foo.db
      
  • SQLALCHEMY_TRACK_MODIFICATIONS 在Flask中是否追踪数据修改

  • SQLALCHEMY_ECHO 显示生成的SQL语句,可用于调试

这些配置参数需要放在Flask的应用配置(app.config)中。

from flask import Flask

app = Flask(__name__)

class Config(object):
    SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1:3306/monitor'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ECHO = True

app.config.from_object(Config)

3 构建模型类映射

 利用数据库中已有的数据库,构建模型类映射,以下面两张表为例

CREATE TABLE `level_scale` (
  `level_id` tinyint(10) unsigned NOT NULL  COMMENT '等级ID(101 健康 ,111 轻度,121  中度,131 重度)',
  `level_name` varchar(50) NOT NULL COMMENT '等级名称',
  `system_id` bigint(20)  NOT NULL DEFAULT '01' COMMENT '系统ID',
  PRIMARY KEY (`level_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='等级典表';

CREATE TABLE `overlimit_alarm_details` (
  `overlimit_alarm_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `system_id` bigint(20)  NOT NULL  COMMENT '系统ID',
  `system_name` varchar(50)  NOT NULL COMMENT '系统名称',
  `object_id` bigint(20) NOT NULL  COMMENT '对象ID',
  `object_name` varchar(50)  NOT NULL COMMENT '对象名称',
  `measuring_point_id` bigint(20)  NOT NULL  COMMENT '测点ID',
  `measuring_point_name` varchar(50)  NOT NULL COMMENT'测点名称',
  `value_type` varchar(50) NOT NULL COMMENT '数据类型',
  `level_id` tinyint(10)  NOT NULL DEFAULT '111' COMMENT '等级ID(101 健康 ,111 轻度,121  中度,131 重度)',
  `level_name` varchar(50) NOT NULL DEFAULT '轻度' COMMENT '等级名称',
  `overlimit_code` bigint(20)   NOT NULL DEFAULT '0100010000' COMMENT '超限编码(0100000000 正常 ,0100010000 超一限,0100100000 超二限)',
  `overlimit_name` varchar(50) NOT NULL DEFAULT '超一限' COMMENT '超限名称',
  `min_value` varchar(50) COMMENT '最小值',
  `max_value` varchar(50) COMMENT '最大值',
  `average_value` varchar(50) COMMENT '平均值',
  `value` varchar(50) COMMENT '当前值',
  `indicator_value` varchar(50) COMMENT '指标值',
  `alarm_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '告警时间',
  `trigger_number` varchar(50) COMMENT '触发次数',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`overlimit_alarm_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='超限告警明细表';

首先需要创建SQLAlchemy对象:

  • 方式一:

      db = SQLAlchemy(app)
    
  • 方式二:

      db = SQLAlchemy()
      db.init_app(app)
    

    注意此方式在单独运行调试时,对数据库操作需要在Flask的应用上下文中进行,即

      with app.app_context():
          User.query.all()

实操:在common/models目录下新建demo.py 

"""测试"""
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
app=Flask(__name__)

class Config(object):
    SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1/monitor'  # 数据库
    SQLALCHEMY_TRACK_MODIFICATIONS = False  # 追踪数据的修改信号
    SQLALCHEMY_ECHO = True
app.config.from_object(Config) # flask的应用app 加资配置文件后获取到了数据的连接信息

db=SQLAlchemy(app)             # 方式一 创建SQLAlchemy对象时db,将flask的应用app 传入,那么db就可以获取到数据的连接信息

class Level(db.Model):        # 创建的模型类继承了db.Model 模型类与数据库就绑定了
    """
    等级典表
    """
    __tablename__ = 'level_scale'
    level_id=db.Column(db.Integer,primary_key=True,doc='主键ID');
    level_name = db.Column(db.String, doc='等级名称')
    system_id=db.Column(db.Integer,default='01', doc='系统ID')

class Overlimit(db.Model):
    """
    超限告警明细表
    """
    __tablename__='overlimit_alarm_details'
    class STATUS:
        health=101
        mild=111
        moderate=121
        severe=131

    id=db.Column('overlimit_alarm_id',db.Integer,primary_key=True, doc='主键ID')
    system_id=db.Column(db.Integer,doc='系统ID')
    system_name=db.Column(db.String,doc='系统名称')
    object_id=db.Column(db.Integer,doc='对象ID')
    object_name=db.Column(db.String,doc='对象名称')
    measuring_point_id=db.Column(db.Integer,doc='测点ID')
    measuring_point_name=db.Column(db.String,doc='测点名称')
    value_type=db.Column(db.String,doc='数值类型')
    level_id=db.Column(db.Integer,default='111', doc='等级ID')
    level_name=db.Column(db.String,default='轻度',doc='等级名称')
    overlimit_code = db.Column(db.Integer, default='0100010000', doc='超限编码')
    overlimit_name = db.Column(db.String, default='轻度', doc='等级名称')
    min_value=db.Column(db.String,doc='最小值')
    max_value = db.Column(db.String, doc='最大值')
    average_value = db.Column(db.String, doc='平均值')
    value = db.Column(db.String, doc='当前值')
    indicator_value = db.Column(db.String, doc='指标值')
    alarm_time= db.Column(db.DateTime, default=datetime.now,doc='告警时间')
    trigger_number = db.Column(db.String, doc='触发次数')
    create_time= db.Column(db.DateTime, default=datetime.now,doc='记录创建时间')

@app.route('/')
def index():
    ret = Status.query.all()
    print(ret)
    return 'ok'

pycharm测试

步骤一: 导入

 步骤二:创建一个告警类

overlimit=Overlimit(id=1,system_id=10,system_name='安全监测系统',object_id=101000,
object_name='瓦斯传感器',measuring_point_id=0001,measuring_point_name='安全监测系统:瓦斯传感器',value_type='瓦斯',min_value='1.2',max_value='5.5',average_value='2.3',value='3.2',
indicator_value='3',trigger_number='3')


系统编码:

id      name
10      安全监测系统 
20      火灾系统
30      水灾系统

对象编码:
id       name
101000   瓦斯传感器

测点编码:
id        name
10000     安全监测系统:瓦斯传感器

步骤三:创建session 提交

db.session.add(overlimit)
db.session.commit()

步骤四:查看确认

蓝图

在Flask中,使用蓝图Blueprint来分模块组织管理。

蓝图可以理解为是一个存储一组视图方法的容器对象:具有以下特点:

(1)一个应用可以具有多个Blueprint

(2)可以将一个Blueprint注册到任何一个未使用的URL下,比如”/user“、”/goods“

 (3) Blueprint 可以单独具有自己的模板、静态文件或者其他的通用操作方法,他并不是要实现应用的是视图和函数的

(4)在一个应用初始化时就应该要注册需要使用的Blueprint

但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值