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)内初始化文件
此文件的作用:
- 利用 redis 模块创建 redis 对象
- 利用 Flask 模块创建 Flask 实例的函数
- 利用插件 SQLAlchemy 创建 db 数据库
- 绑定蓝图及静态 html 文件
- 生成日志文件
- 自定义正则表达式
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