flask蓝图

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()

 

SQLAlchemy存储session的基本配置:

注意: 需要手动创建session表,在项目第一次启动的时候,使用db.create_all()来完成创建。

配置:

"""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

  • 可以将一个Blueprint注册到任何一个未使用的URL下比如 “/”、“/sample”或者子域名

  • 在一个应用中,一个模块可以注册多次

  • Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的

  • 在一个应用初始化时,就应该要注册需要使用的Blueprint

1. 创建一个蓝图的包,例如home,并在__init__.py文件中创建蓝图对象

from flask import Blueprint
home_blu = Blueprint('home',__name__)

2. 在这个蓝图目录下, 创建views.py文件,保存当前蓝图使用的视图函数

def index():
    return "ok"

3. home/__init__.py中引入views.py中所有的视图函数和给视图配置路由

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关键字参数(这个参数默认是/)

  • 在应用最终的路由表 url_map中,在蓝图上注册的路由URL自动被加上了这个前缀,这个可以保证在多个蓝图中使用相同的URL规则而不会最终引起冲突,只要在注册蓝图时将不同的蓝图挂接到不同的自路径即可

  • 有了蓝图以后,url_for在使用时,如果要生成一个蓝图里面的视图对应的路由地址,则需要声明当前蓝图名称.视图名称

  • 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只保存特殊模板,名字与蓝图中的进行明显区分。

 

posted on 2020-11-03 21:16  fdsimin  阅读(86)  评论(0编辑  收藏  举报