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

  • 相关阅读:
    问题 A: 走出迷宫(BFS)
    问题 A: 工作团队(并查集删点操作)
    刷题-力扣-989
    刷题-力扣-12
    刷题-力扣-628
    刷题-力扣-11
    刷题-力扣-1018
    刷题-力扣-9
    刷题-力扣-7
    刷题-力扣-6
  • 原文地址:https://www.cnblogs.com/fdsimin/p/13922620.html
Copyright © 2020-2023  润新知