1. flask-migrate组件:
安装:
pip install flask-migrate -i https://pypi.doubanio.com/simple
配置:
from flask import Flask,request,jsonify,render_template # 初始化 app = Flask(import_name=__name__) app.config.from_object(Config) db.init_app(app) # 初始化数据库链接 from flask_script import Manager manager = Manager(app) from flask_migrate import Migrate,MigrateCommand #第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例 migrate = Migrate(app,db) #manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令 manager.add_command('db',MigrateCommand) @app.route(rule='/') def index(): return "ok" if __name__ == '__main__': # 运行flask manager.run()
创建版本仓库:
#这个命令会创建migrations文件夹,所有迁移文件都放在里面。 python main.py db init
创建迁移版本:
python main.py db migrate -m 'initial migration' # 这里等同于django里面的 makemigrations,生成迁移版本文件
升级版本:
python main.py db upgrade
降级版本:
python manage.py db downgrade # 默认返回上一个版本 python manage.py db downgrade 版本号 # 返回到指定版本号对应的版本
查看历史版本:
python manage.py db history
输出格式:<base> -> 版本号 (head), initial migration
有时候会出现的bug:
flask-migrate扩展包在对于复杂的数据表关系时,生成的迁移文件有时候会出现紊乱.在迁移文件中,原来要创建或者删除的数据表信息会丢失,变成None,
这种迁移文件有可能无法执行upgrade或者downgrade,所以每次如果遇到数据表的操作存在1对多或者多对多的情况下,
最好检查下migrations/versions版本目录下的新生成迁移文件中的代码.
2. Faker组件:
安装:
pip install faker -i https://pypi.doubanio.com/simple
使用Faker创建仿真数据:
from faker import Faker import random faker = Faker(locale="zh_CN") class FakerCommend(Command): def run(self): data = [] for _ in range(100): data.append(Student( name = faker.name(), sex=random.randint(0,1), age=random.randint(18,30), email=faker.email(), money=random.randint(800,10000) )) db.session.add_all(data) db.session.commit() manager.add_command("faker", FakerCommend)
3. flask-Session:
安装:
pip install flask-Session -i https://pypi.douban.com/simple
使用session之前,必须配置一下配置项:
SECRET_KEY = "*(%#4sxcz(^(#$#8423" # session秘钥
Redis保存session的基本配置:
先安装配置flask-redis模块到项目中:
pip install flask-redis -i https://pypi.douban.com/simple
配置:
# 声明和加载配置 class Config(): DEBUG = True # 数据库链接配置 = 数据库名称://登录账号:登录密码@数据库主机IP:数据库访问端口/数据库名称?charset=编码类型 SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/students?charset=utf8" # 动态追踪修改设置,如未设置只会提示警告 SQLALCHEMY_TRACK_MODIFICATIONS = False # 显示原始SQL语句 SQLALCHEMY_ECHO = False # 调整json数据转换中文的配置 JSON_AS_ASCII=False # session秘钥 SECRET_KEY = "L>PG#5394&()%#34" # redis的链接配置 # REDIS_URL = "redis://:密码@IP地址:端口/数据库下标" REDIS_URL = "redis://@127.0.0.1:6379/0"
初始化redis
from flask_redis import FlaskRedis redis = FlaskRedis() redis.init_app(app) # 初始化redis
Redis的相关配置:
# session存储方式为redis SESSION_TYPE = "redis" # 如果设置session的生命周期是否是会话期, 为True,则关闭浏览器session就失效 SESSION_PERMANENT = False # 是否对发送到浏览器上session的cookie值进行加密 SESSION_USE_SIGNER = False # 保存到redis的session数的名称前缀 SESSION_KEY_PREFIX = "session:" # session保存数据到redis时启用的链接对象 SESSION_REDIS = redis # 用于连接redis的配置
Redis保存session例子:
@app.route(rule='/') def index(): session["uname"] = "hehehe" return "ok" @app.route(rule="/get_session") def get_session(): print(session.get("uname")) return "ok" if __name__ == '__main__': # 运行flask manager.run()
"""session存储方式为SQLAlchemy""" # session类型为sqlalchemy SESSION_TYPE = "sqlalchemy" # SQLAlchemy数据库链接对象 SESSION_SQLALCHEMY = db # session要保存的表名称 SESSION_SQLALCHEMY_TABLE = "tb_session" # 如果设置为True,则关闭浏览器session就失效 SESSION_PERMANENT = "True" # 对发送到浏览器上的session_id进行加密 SESSION_USE_SIGNER=True # 保存到session中的值的前缀 SESSION_KEY_PREFIX = "session:"
代码:
from flask import Flask,session from config import Config,redis # 初始化 app = Flask(import_name=__name__,template_folder='templates') app.config.from_object(Config) db.init_app(app) # 初始化数据库链接 from flask_script import Manager manager = Manager(app) from flask_migrate import Migrate,MigrateCommand #第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例 migrate = Migrate(app,db) #manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令 manager.add_command('db',MigrateCommand) from comands import FakerCommand manager.add_command("faker",FakerCommand) from flask_session import Session Session(app) redis.init_app(app) @app.route(rule='/') def index(): session["uname"] = "hehehe" return "ok" @app.route(rule="/get_session") def get_session(): print(session.get("uname")) return "ok" if __name__ == '__main__': # 运行flask manager.run()
4. 蓝图(blueprite):
-
-
可以将一个Blueprint注册到任何一个未使用的URL下比如 “/”、“/sample”或者子域名
-
在一个应用中,一个模块可以注册多次
-
Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的
-
from flask import Blueprint home_blu = Blueprint('home',__name__)
2. 在这个蓝图目录下, 创建views.py文件,保存当前蓝图使用的视图函数
def index(): return "ok"
3.
from flask import Blueprint home_blu = Blueprint('home',__name__) from . import views home_blu.add_url_rule("/index",endpoint="index", view_func=views.index) # 子路由
4. 在主程序run.py文件中的app对象上注册这个**home**蓝图对象
# 注册蓝图 from home import home_blu app.register_blueprint(home_blu,url_prefix='/home') # url_prefix='' 总路由
当这个应用启动后,通过`http://127.0.0.1:5000/home/index`可以访问到蓝图中定义的视图函数
运行机制:
- 蓝图是保存了一组将来可以在应用app对象上执行的操作,注册路由就是一种操作 - 当在app对象上调用 route 装饰器注册路由时,这个操作将修改对象的url_map路由表 - 然而,蓝图对象根本没有路由表,当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一个项 - 当执行app对象的 register_blueprint() 方法时,app应用对象将从蓝图对象的 defered_functions 列表中取出每一项,并以自身作为参数执行该匿名函数,
即调用app应用对象的 add_url_rule() 方法,将蓝图的路由信息全部注册到应用对象app的url_map路由表
URL前缀:
当我们在应用对象上注册一个蓝图时,可以指定一个url_prefix关键字参数(这个参数默认是/)
-
-
-
print(url_for("home.index"))
静态文件的相关路由:
和app应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。需要我们在 创建时指定 static_folder 参数。
下面的示例将蓝图所在目录下的static_home目录设置为静态目录
# home/__init__.py,代码: from flask import Blueprint home_blu = Blueprint('home',__name__,static_folder="static_home") from . import views home_blu.add_url_rule("/index",endpoint="index", view_func=views.index) # 主程序文件 run.py,代码: # 注册蓝图 from home import home_blu app.register_blueprint(home_blu,url_prefix='/home')
现在就可以使用/home/static_home/ 访问static_home目录下的静态文件了 定制静态目录URL规则 :可以在创建蓝图对象时使用 static_url_path 来改变静态目录的路由。
from flask import Blueprint # static_url_path="/lib" # 设置静态文件访问的子路由,如果不设置,则默认蓝图的静态文件子路由是static_folder的值 # 静态文件的访问路径规则: http://127.0.0.1:5000/总路由/子路由/文件名 home_blu = Blueprint('home',__name__,static_folder="static_home",static_url_path="/lib") from . import views home_blu.add_url_rule("/index",endpoint="index", view_func=views.index)
有了蓝图的静态目录以后,并不会影响原来项目中提供的static总静态文件目录的使用。
蓝图模板的设置:
蓝图对象默认的模板目录为系统的模版目录,可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录, 这样可以避免文件同名带来的冲突
创建蓝图中的模板目录template_home:
from flask import Blueprint # static_url_path="/lib" 设置静态文件访问的子路由,如果不设置,则默认蓝图的静态文件子路由是static_folder的值 # 静态文件的访问路径规则: http://127.0.0.1:5000/总路由/子路由/文件名 home_blu = Blueprint('home',__name__, static_folder="static_home", static_url_path="/lib", template_folder="template_home") from . import views home_blu.add_url_rule("/index",endpoint="index", view_func=views.index)
注:如果在 app应用对象中的templates 中存在和 蓝图中存在的templates_home 有同名模板文件时, 则系统会优先使用 templates 中的文件。所以要么不要使用app应用的templates,要么,就app应用对象的templates只保存特殊模板,名字与蓝图中的进行明显区分。