Bootstrap

Flask 项目(更新中)

Pycharm 一级目录(配置及入口)

在这里插入图片描述

配置文件

config.py

import redis  # 用于 redis 的关联
import os  # 用于生成一段随机的字符串


class Config(object):
    """配置信息主类"""
    DEBUG = True

    # Mysql 数据库配置
    USERNAME = 'root'
    PASSWORD = 'root'
    HOSTNAME = '127.0.0.1'
    MYSQLPROT = 3306
    DATABASE = 'mysql_1'

    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, MYSQLPROT, DATABASE)
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    # redis 配置
    REDIS_HOST = '127.0.0.1'  # 用户 id
    REDIS_PORT = 6379  # 用户端口
    REDIS_DB = 0

    # flask 需要加密
    SECRET_KEY = os.urandom(10)  # 用于生成一段字符串, 用于随机加密

    # flask-session
    SESSION_TYPE = 'redis'      # 将 session 信息保存到 redis 中
    SESSION_REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)
    SESSION_USE_SIGNER = True   # 对 cookie 中的 session_id 进行签名处理
    PERMANENT_SESSION_LIFETIME = 60*60*24      # session 数据的有效期(24h)


#  以下二个继承的子类可以重写父类属性
class DevConfig(Config):
    """开发环境的配置信息"""
    DEBUG = True


class ProConfig(Config):
    """生产环境的配置信息"""
    DEBUG = False  # 重写 DEBUG 属性为 False


# 创建一个字典, 用于创建 Flask 实例
config_map = {
    'dev': DevConfig,
    'pro': ProConfig
}

项目入口文件

manage.py

from home import create_app, db  # 从包目录 home 中导入 create_app 函数和 db 数据库
from flask_script import Manager  # Script 插件
from flask_migrate import Migrate, MigrateCommand  # Migrate 插件


# 工厂模式
app = create_app('dev')

# 数据库迁移插件
manage = Manager(app)
Migrate(app, db)
manage.add_command("db", MigrateCommand)

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

包(home)内初始化文件

此文件的作用:

  1. 利用 redis 模块创建 redis 对象
  2. 利用 Flask 模块创建 Flask 实例的函数
  3. 利用插件 SQLAlchemy 创建 db 数据库
  4. 绑定蓝图及静态 html 文件
  5. 生成日志文件
  6. 自定义正则表达式
import redis  # 导入 redis 服务
from flask import Flask  # 用于创建 Flask 实例
from flask_sqlalchemy import SQLAlchemy  # 导入 SQLAlchemy 插件
from config import config_map  # 创建环境模式
from flask_session import Session  # 用于 session 验证
from flask_wtf import CSRFProtect  # 用于表单
from home import api_1_0  # 导入蓝图
import logging  # 用于日志生成
from logging.handlers import RotatingFileHandler  # 用于日志生成
from home.utils.commons import ReConverter  # 自定义正则表达式


# 数据库
db = SQLAlchemy()

# 创建 redis 连接对象
redis_store = None


# 生成日志
def setup_log():
    # error     错误级别
    # warning   警告级别
    # info      信息提示
    # debug     调试级别
    # 设置日志的的等级  DEBUG 调试级别
    logging.basicConfig(level=logging.DEBUG)
    # 创建日志记录器, 设置日志的保存路径和每个日志的大小和日志的总大小 b kb M G T
    # 如果文件超过 100M 新建一个文件 log.log 记录  log1.log
    file_log_handler = RotatingFileHandler("logs/log.log", maxBytes=1024*1024*100, backupCount=10)
    # 创建日志记录格式, 日志等级, 输出日志的文件名 行数 日志信息
    formatter = logging.Formatter("%(levelname)s %(filename)s: %(lineno)d %(message)s")
    # 为日志记录器设置记录格式
    file_log_handler.setFormatter(formatter)
    # 为全局的日志工具对象(flaks app 使用的)加载日志记录器
    logging.getLogger().addHandler(file_log_handler)


# 选择环境
def create_app(config_name):  # 函数传递一个参数
    """
    创建 flask 的应用对象
    :param config_name: str 配置模式的名字
    :return: app
    """
    setup_log()
    app = Flask(__name__, static_folder='static')  # 静态 html 文件指定目录
    # 根据传递的参数(key)在字典 config_map 中取得相应的值(value)
    config_class = config_map.get(config_name)  # DevConfig
    app.config.from_object(config_class)  # app 配置

    # 初始化 db
    db.init_app(app)

    # 设置全局变量
    global redis_store
    redis_store = redis.Redis(host=config_class.REDIS_HOST, port=config_class.REDIS_PORT)

    # session 和 cookie session 信息就会保存到 redis 中
    Session(app)

    # 为 flask 添加防护机制
    CSRFProtect(app)

    # 为 flask 添加自定义的转换器
    app.url_map.converters['re'] = ReConverter

    # 注册蓝图
    app.register_blueprint(api_1_0.book_bp)

    # 注册提供静态文件的蓝图
    import web_html
    app.register_blueprint(web_html.html)

    return app

Pycharm 二级目录(蓝图)

特别注意:蓝图对象创建后需要在实例化 Flask 对象的时候绑定蓝图

在这里插入图片描述

蓝图文件

_init _.py

# 视图函数模板部分
from flask import Blueprint, render_template
# 模块:Blueprint  实例化蓝图对象, render_template 连接 html 文件

book_bp = Blueprint('book', __name__, url_prefix='', template_folder='html')
# 实例化对象 book_bp, 参数 book 为蓝图文件名字, 参数 template_folder 修改 html 原始目录


# @book_bp.route('/')  # 蓝图绑定视图函数
# def first():  # 视图函数
#     return '首页'


@book_bp.route('/book/')  # 蓝图绑定视图函数
def book():  # 视图函数
    return '图书首页'


@book_bp.route('/detail/<aid>')  # 蓝图绑定视图函数
def book_detail(aid):  # 视图函数
    return render_template('book.html', a=aid)

静态 html 文件

web_html.py

from flask import Blueprint, current_app, make_response  # 模块:Blueprint  实例化蓝图对象
from flask_wtf import csrf  # 用于生成 CSRF 的值

html = Blueprint('web_html', __name__)
# 实例化对象 html, 参数 web_html 为蓝图文件名字


@html.route('/<re(".*"):html_file_name>')  # re 为自定义的正则
def get_html(html_file_name):
    """提供 HTML 文件"""

    if not html_file_name:
        html_file_name = 'index.html'
    html_file_name = 'html/' + html_file_name

    # 生成 CSRF 的值
    csrf_token = csrf.generate_csrf()

    # 用于获取当前对象
    response = make_response(current_app.send_static_file(html_file_name))

    # 当前 html 页面对象设置 cookie
    response.set_cookie('csrf_token', csrf_token)

    # flask 提供的返回静态文件的方法
    return response

日志文件

存放位置

在这里插入图片描述
生成日志的函数(此函数在初始化 Flask 函数中被调用)

# 生成日志
def setup_log():
    # error     错误级别
    # warning   警告级别
    # info      信息提示
    # debug     调试级别
    # 设置日志的的等级  DEBUG 调试级别
    logging.basicConfig(level=logging.DEBUG)
    # 创建日志记录器, 设置日志的保存路径和每个日志的大小和日志的总大小 b kb M G T
    # 如果文件超过 100M 新建一个文件 log.log 记录  log1.log
    file_log_handler = RotatingFileHandler("logs/log.log", maxBytes=1024*1024*100, backupCount=10)
    # 创建日志记录格式, 日志等级, 输出日志的文件名 行数 日志信息
    formatter = logging.Formatter("%(levelname)s %(filename)s: %(lineno)d %(message)s")
    # 为日志记录器设置记录格式
    file_log_handler.setFormatter(formatter)
    # 为全局的日志工具对象(flaks app 使用的)加载日志记录器
    logging.getLogger().addHandler(file_log_handler)

静态 html 文件存放位置

在这里插入图片描述

此项目文件可以实现的内容如下

其一:渲染静态 html 文件

从入口文件启动,url 为 / 时,静态文件渲染为 index.html

在这里插入图片描述

url 为 /myhouse.html 时,静态文件渲染为 myhouse.html

在这里插入图片描述

其二:渲染蓝图 html 文件

url 为 /book 时,返回字符串

在这里插入图片描述
url 为 /detail/100 时,返回 html 文件 book.html

在这里插入图片描述

;