配置文件:
import logging
from redis import StrictRedis
class Config(object):
"""项目的配置"""
SECRET_KEY = "iECgbYWReMNxkRprrzMo5KAQYnb2UeZ3bwvReTSt+VSESW0OB8zbglT+6rEcDW9X"
# 为数据库添加配置
SQLALCHEMY_DATABASE_URI = "mysql://root:[email protected]:3306/information27"
SQLALCHEMY_TRACK_MODIFICATIONS = False
# Redis的配置
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
# Session保存配置
SESSION_TYPE = "redis"
# 开启session签名
SESSION_USE_SIGNER = True
# 指定 Session 保存的 redis
SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT)
# 设置需要过期
SESSION_PERMANENT = False
# 设置过期时间
PERMANENT_SESSION_LIFETIME = 86400 * 2
# 设置日志等级
LOG_LEVEL = logging.DEBUG
class DevelopmentConfig(Config):
"""开发环境下的配置"""
DEBUG = True
class ProductionConfig(Config):
"""生产环境下的配置"""
DEBUG = False
LOG_LEVEL = logging.WARNING
class TestingConfig(Config):
"""单元测试环境下的配置"""
DEBUG = True
TESTING = True
config = {
"development": DevelopmentConfig,
"production": ProductionConfig,
"testing": TestingConfig
}
创建app
import logging
from logging.handlers import RotatingFileHandler
from flask import Flask
# 可以用来指定 session 保存的位置
from flask.ext.session import Session
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.wtf import CSRFProtect
from redis import StrictRedis
from config import config
# 初始化数据库
# 在Flask很多扩展里面都可以先初始化扩展的对象,然后再去调用 init_app 方法去初始化
db = SQLAlchemy()
# https://www.cnblogs.com/xieqiankun/p/type_hints_in_python3.html
redis_store = None # type: StrictRedis
# redis_store: StrictRedis = None
def setup_log(config_name):
# 设置日志的记录等级
logging.basicConfig(level=config[config_name].LOG_LEVEL) # 调试debug级
# 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024 * 1024 * 100, backupCount=10)
# 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息
formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
# 为刚创建的日志记录器设置日志记录格式
file_log_handler.setFormatter(formatter)
# 为全局的日志工具对象(flask app使用的)添加日志记录器
logging.getLogger().addHandler(file_log_handler)
def create_app(config_name):
# 配置日志,并且传入配置名字,以便能获取到指定配置所对应的日志等级
setup_log(config_name)
# 创建Flask对象
app = Flask(__name__)
# 加载配置
app.config.from_object(config[config_name])
# 通过app初始化
db.init_app(app)
# 初始化 redis 存储对象
global redis_store
redis_store = StrictRedis(host=config[config_name].REDIS_HOST, port=config[config_name].REDIS_PORT)
# 开启当前项目 CSRF 保护,只做服务器验证功能
CSRFProtect(app)
# 设置session保存指定位置
Session(app)
# 设置csrf随机值cookie
@app.after_request
def after_request(response):
# 调用函数生成 csrf_token
csrf_token = generate_csrf()
# 通过 cookie 将值传给前端
response.set_cookie("csrf_token", csrf_token)
return response
# 注册蓝图
from info.modules.index import index_blu
app.register_blueprint(index_blu)
return app
项目启动入口:
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from info import create_app, db, models
# manage.py是程序启动的入口,只关心启动的相关参数以及内容,不关心具体该
# 如果创建app或者相关业务逻辑
# 通过指定的配置名字创建对应配置的app
# create_app 就类似于工厂方法
app = create_app('development')
manager = Manager(app)
# 将 app 与 db 关联
Migrate(app, db)
# 将迁移命令添加到manager中
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()