项目说明

1、创建项目

2、session保存redis

3、自定义路由转换器

4、记录日志

5、数据库设计生成模型类

6、数据库迁移处理

创建项目

创建一个名为manage.py 文件

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager

app = Flask(__name__)  # type:Flask

# 创建管理对象
manager = Manager(app)

class Config(object):
    DEBUG = True  #开启调试
    # msyql 数据库uri
    SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1:3306/shop' 
    # 开启数据库跟踪 
    SQLALCHEMY_TRACK_MODIFICATIONS = True 
    # 自动提交
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SECRET_KEY = 'SD+AF-ASD+++OJ43-90-09'  # 安全key

app.config.from_object(Config)
# 创建数据库实例
db = SQLAlchemy(app)
Migrate(app, 'db')
# manager  是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
manager.add_command('db', MigrateCommand)

@app.route('/')
def index():
    return 'ok'


if __name__ == '__main__':
    manager.run()

seesion 保存redis

在基础课上我们学习session的时候知道,flask中的seesion是保存在cookie中的。在项目中我们不在将session保存在cookie中,这里引入flask-session扩展,将session保存在redis中,redis是内存型数据库读取速度快并且还可以设置超时时间。

pip install flask-session

Flask-Session官方文档参

在Config类中增加redis配置


from flask_session import Session

def Config(object): 

    ...... 省略其他配置

    # Redis
    REDIS_HOST = "127.0.0.1"
    REDIS_PORT = 6379

    # session
    SESSION_TYPE = "redis"  # 启用redis保存session
    SESSION_USE_SINGER = True  # cookie中的session_id进行加密(签名)处理
    SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)  # 使用的redis实例
    PERMANENT_SESSION_LIFETIME = 86400  # session的有效期,单位秒

# 调整flask的session机制,根据配置信息将session数据放到redis中
Session(app)

自定义正则路由转换器

创建一个名为commons.py的公共模块,将一些通用的函数封装到这个模块。正则转换是每一个蓝图都公用的,所以将正则转换器定义到commons.py 这个模块中

class RegexConverter(BaseConverter):
    """提供路由正则转换器"""
    def __init__(self, url_map, *args):
        # 调用父类的初始化方法
        super(RegexConverter, self).__init__(url_map)
        # 将正则表达式传给转换器对象,flask在解析路径的时候,会来这里获取regex保存的正则表达式
        self.regex = args[0]

在FLASK实例中导入模块,添加路由转换器。

from shop.commons import RegexConverter
# 添加自定义的路由转换器
app.url_map.converters["re"] = RegexConverter

记录日志

生产环境上的项目日志非常重要,许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪。

Python为我们提供了简单易用、且功能强大的日志模块:logging。

项目中的日志可以保存到任何地方,不一定是保存在项目中,我们为了方便直接保存在项目目录下。

在项目目录下创建一个logs文件夹保存日志文件。

logging 有4个组件:

logger: 日志类,应用程序往往通过调用它提供的api来记录日志;

handler: 对日志信息处理,可以将日志发送(保存)到不同的目标域中;

filter: 对日志信息进行过滤;

formatter:日志的格式化;

日志级别:

级别 对应值
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
NOTSET 0

可以给日志对象(logger)设置日志级别,低于该级别的日志消息将会被忽略,也可以给Hanlder设置日志级别,对于低于该级别的日志消息, Handler也会忽略。

在项目中添加logging日志功能


import logging
from logging.handlers import RotatingFileHandler

# 设置日志的记录等级,低于设置的日志等级不会记录。
logging.basicConfig(level=logging.DEBUG)  # 调试debug级
# 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
log_handler = RotatingFileHandler("logs/log.text", maxBytes=1024*1024*100, backupCount=10)
# 创建日志记录的格式                 日志等级    输入日志信息的文件名 行数    日志信息
formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
# 为刚创建的日志记录器设置日志记录格式
log_handler.setFormatter(formatter)
# 为全局的日志工具对象添加日志记录器
logging.getLogger().addHandler(log_handler)

保存日志:

import logging

# 分别保存不同级别的日志
logging.error('error')
logger.warning("warning")
logger.info("info")
logger.debug("debug")

# 利用flask 实例调用logger保存 日志
from flask import current_app

current_app.logger.warning('warning)
current_app.logger.info('info)
current_app.logger.debug('debug)

注意:flask 12.0 以上版本不能通过flask实例调用logger保存日志

项目数据库设计

1、根据项目所需要存储的字段设计数据表,以及表关系,生成模型类。 2、数据库迁移,生成mysql物理表。

数据库迁移

创建迁移仓库

python manage.py db init

执行命令之后会在项目文件下生成一个 migrations 文件夹,生成的迁移文件都会保存在 versions目录下。

生成迁移文件

# 根据模型类生成迁移文件。  -m 参数是版本备注,,相当于git中的-m参数
python manage.py db migrate -m '第一次迁移'

执行迁移 只有执行迁移之后才会真的在数据库中生成表。

python manage.py db upgrade

查看迁移历史记录

python manage.py db history

回退数据库

python manage.py db downgrade 版本号

比如我们要回退到第一次迁移:

 python manage.py db downgrade 671c4730a985
E:\flask_shop>python manage.py db migrate -m  'test'
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.env] No changes in schema detected.

如果迁移的时候出现这个提示,那么可能是models.py在项目中没有任何关联。这个时候需要将models在视图中导入,让models.py跟项目关联起来。

Iyoyo电子书 一本集作者多年开发经验的python电子书 all right reserved,powered by Gitbook文件修订时间: 2022年 09:53:22