补充:在使用蓝图时,注册蓝图应在创建app的函数中导入创建的蓝图
项目的分组
manage.py文件
# conding:utf-8
from ihome import creat_app, db
from flask_script import Manager # 导入脚本
from flask_migrate import Migrate, MigrateCommand # 管理models
app = creat_app("development")
Migrate(app=app, db=db) # 将迁移者保存在app中,并且在迁移的过程中使用到数据库
manager = Manager(app) # 使用manager管理app
manager.add_command("db", MigrateCommand) # 添加数据库的命令
if __name__ == '__main__':
manager.run()
config.py
import redis
class Config(object):
"""flask的配置"""
SECRET_KEY = "EQWEQWNJEWHNQJK34N423NYH56NKEWK" # 配置密钥
# 配置redis链接的主机和端口号
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
# mysql数据库的配置,先在数据库新建database
SQLALCHEMY_DATABASE_URI = "mysql://root:@localhost:3306/ihome"
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 在app中做session的配置
SESSION_TYPE = "redis" # 存储session的类型为redis
SESSION_REDIS = redis.StrictRedis(host=REDIS_PORT, port=REDIS_PORT) # 测试项目使用同一台redis服务器
SESSION_USE_SIGNER = True # 对cookie中的session_id做混淆处理
PERMANENT_SESSION_LIFETIME = 86400 # 设置session的有效期,时间为一天
class DevelopmentConfig(Config):
"""开发模式的配置"""
DEBUG = True # debug为true
class ProduceConfig(Config):
"""生产模式"""
pass
#配置映射
CONFIG_MAP = {
"development": DevelopmentConfig,
"produce": ProduceConfig
}
ihome下的 init.py
from flask import Flask
from config import CONFIG_MAP
from flask_sqlalchemy import SQLAlchemy # 导入和flask框架相关的mysql数据库
import redis, logging # 导入redis数据库,作为缓存数据库 导入日志logging
from flask_session import Session # 使用flask扩充的session
from flask_wtf import CSRFProtect
from logging.handlers import RotatingFileHandler
# 创建数据库,一开始不绑定app,当app被创建时再绑定app
db = SQLAlchemy()
redis_store = None
# csrf保护
csrf = CSRFProtect()
# log记录
def setup_log():
"""配置日志"""
# 级别从高到低
# logging.error() # 错误级别
# logging.warn() # 警告级别
# logging.info() # 消息级别
# logging.debug() # 调试级别
# 设置日志的记录等级
logging.basicConfig(level=logging.DEBUG) # 调试debug级
# 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限,最多保留10个文件
file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024*1024*100, backupCount=10)
# 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息
formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
# 为刚创建的日志记录器设置日志记录格式
file_log_handler.setFormatter(formatter)
# 为全局的日志工具对象(flask app使用的)添加日志记录器
logging.getLogger().addHandler(file_log_handler)
# app的工厂模式,根据不同的开发环境使用不同的配置
def creat_app(config_name):
"""
根据不同的环境,配置app
:param config_name: str类型 可选{"development","produce"}
:return:
"""
app = Flask(__name__)
# 选择不同环境的config
config_type = CONFIG_MAP.get(config_name)
# 注册配置
app.config.from_object(config_type)
# app被创建时绑定app
db.init_app(app)
# 全局变量声明
global redis_store
# 创建redis链接对象
redis_store = redis.StrictRedis(host=config_type.REDIS_HOST, port=config_type.REDIS_PORT) # host为链接的主机,port为链接的端口号,在config中配置
from ihome.api_v1 import api # 放在函数中,解决循环导入的问题
# 注册蓝图
app.register_blueprint(api, url_prefix="/v1")
# csrf保护
CSRFProtect(app)
# 配置session,将session数据保存在redis中
Session(app)
setup_log() # 创建app时启动log文件
return app
蓝图设计
# 测试使用的demo,使用flask中的蓝图
from flask import Blueprint
# 创建蓝图对象
api = Blueprint('api_1_0', __name__)
# 让蓝图知道demo的存在
from . import demo
from . import api
@api.route('/')
def hello_world():
return 'Hello World!'
在项目中使用到了蓝图的包,防止循环导包,在注册app的函数中,注册蓝图之前再导入蓝图!