[ Flask初始化配置 ]


extensions文件

数据库init

from flask_sqlalchemy import SQLAlchemy
from flask_sqlalchemy.query import Query # baseQuery
from flask_marshmallow import Marshmallow
from flask_migrate import Migrate
from flask import Flask
import click

db = SQLAlchemy()
ma = Marshmallow()
migrate = Migrate()

def init_databases(app: Flask):
    db.init_app(app)
    ma.init_app(app)
    migrate.init_app(app, db)

日志init

from flask import Flask
import logging

def init_logs(app: Flask):
    logging_format = logging.Formatter(
        "[%(asctime)s][%(filename)s:%(lineno)d][%(levelname)s][%(thread)d] - %(message)s"
    )
    handler = logging.FileHandler('flask.log', encoding='utf-8')

    handler.setFormatter(logging_format)
    app.logger.addHandler(handler)

flask-login插件init

from flask_login import LoginManager
from flask import Flask

def init_login_manager(app: Flask):
    login_manager = LoginManager()
    login_manager.init_app(app)

    login_manager.login_view = 'userView.login'
    login_manager.login_message = '请登录以访问此页面'

    @login_manager.user_loader
    def load_user(user_id):
        from ..models import User
        user = User.query.get(int(user_id))
        return user

app初始化 init

import click
from .init_sqlalchemy import db
from flask import Flask
from flask_session import Session

# 数据库迁移自定义命令init-db


@click.command('init-db')
def init_db_command():
    from ..models import User, user_role, Role, rolw_power, Power, Classify, QuestionBlank, Log
    db.drop_all()
    db.create_all()
    click.echo('初始化数据库成功')


# 添加init-db命令
def init_app(app: Flask):
    # flask-session配置
    Session(app)
    # flask自定义命令配置
    app.cli.add_command(init_db_command)

extensions/init.py文件

from .init_sqlalchemy import db, ma, init_databases, migrate
from .init_app import init_app
from .init_login import init_login_manager
from .init_logs import init_logs
from flask import Flask

def init_plugs(app: Flask):
    init_logs(app)
    init_databases(app)
    init_app(app)
    init_login_manager(app)

config

config.py

import logging
import os
from redis import Redis

class BaseConfig:
    JSON_AS_ASCII = False
    SECRET_KEY = os.urandom(24)

    REDIS_HOST = '127.0.0.1'
    REDIS_PORT = 6379

    MYSQL_USERNAME = 'root'
    MYSQL_PASSWORD = '123456'
    MYSQL_HOST = '127.0.0.1'
    MYSQL_PORT = 3306
    MYSQL_DATABASE = 'flask'

    SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{MYSQL_USERNAME}:{MYSQL_PASSWORD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}?charset=utf8mb4'

    SESSION_TYPE = 'redis'                                  # flask-sesson使用redis
    SESSION_REDIS = Redis(host=REDIS_HOST, port=REDIS_PORT) # 默认为127.0.0.1 6379
    # SESSION_KEY_PREFIX = 'obj:'                             # 设置开头默认为"session:15a791ab-012e-45bf-9679-b2948ec3b629"
    SESSION_USE_SIGNER = True                               # 开启加盐     
    SESSION_PERMANENT = False                               # 关闭浏览器清空
    PERMANENT_SESSION_LIFETIME = 3600                       # 有效时间

    LOG_LEVEL = logging.WARN


# 开发环境
class DevelopmentConfig(BaseConfig):
    # 跟踪对象的修改, 发送信号, 需要额外的内存
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    # 记录SQL调试答应输出
    SQLALCHEMY_ECHO = True


config = {
    'dev': DevelopmentConfig
}

init

from .config import config