项目说明
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
在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跟项目关联起来。