其他分享
首页 > 其他分享> > 蓝图BluePrint——基于Flask框架

蓝图BluePrint——基于Flask框架

作者:互联网

蓝图 Blueprint

 

模块化

随着flask程序越来越复杂,我们需要对程序进行模块化的处理,之前学习过python的模块化管理,于是针对一个简单的flask程序进行模块化处理

简单来说,Blueprint 是一个存储视图方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求。

Flask使用Blueprint让应用实现模块化,在Flask中,Blueprint具有如下属性:

但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。

Blueprint对象用起来和一个应用/Flask对象差不多,最大的区别在于一个 蓝图对象没有办法独立运行,必须将它注册到一个应用对象上才能生效

使用蓝图可以分为四个步骤

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

 
users=Blueprint('users',__name__)

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

 
@admin.route('/')
def home():
    return 'user.home'

3. 在users/init.py中引入views.py中所有的视图函数

 
from flask import Blueprint
# 等同于原来在 manage.py里面的 app = Flask()
users=Blueprint('users',__name__)

from .views import *

4.在主应用main.py文件中的app对象上注册这个users蓝图对象

 
from users import users
app.register_blueprint(users,url_prefix='/users')

当这个应用启动后,通过/users/可以访问到蓝图中定义的视图函数

 

运行机制

 

蓝图的url前缀

   

注册蓝图中的静态文件的相关路由

和应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。需要我们在 创建时指定 static_folder 参数。

下面的示例将蓝图所在目录下的static_users目录设置为静态目录

 
# users/__init__.py,代码:
user_blu = Blueprint("users",__name__,static_folder='static_users')

# 启动文件 main.py,代码:
from users import user_blu
app.register_blueprint(user_blu,url_prefix='/users')

 

现在就可以使用/admin/static_admin/ 访问static_admin目录下的静态文件了 定制静态目录URL规则 :可以在创建蓝图对象时使用 static_url_path 来改变静态目录的路由。

  image.png

下面的示例将为 static_admin 文件夹的路由设置为 /lib

admin = Blueprint("admin",__name__,static_folder='static_admin',static_url_path='/lib')
app.register_blueprint(admin,url_prefix='/admin')

 

设置蓝图中模版的目录

蓝图对象默认的模板目录为系统的模版目录,可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录

创建蓝图中的模板目录template_users :

  image.png
admin = Blueprint('admin',__name__,template_folder='templates_users')
   

注:如果在 templates 中存在和 templates_users 有同名模板文件时, 则系统会优先使用 templates 中的文件

 

调整session配置

分析SQLAlachemy的构造方式可以发现,初始化并非一定要传递app应用对象到内部,事实上它提供了init_app方法给我们后续调用。而 init_app 方法是flask框架要求任何的第三方组件都要实现这个方法。

init_app方法内部就是要第三方组件开发者编写一些使用当前组建的默认配置项以及把当前组件设置成一个对象,加载到app对象内部extensions字典才能让开发者在flask框架内部配置和使用当前组件。

我们可以利用这种组件开发机制,那么把配置代码抽离出去。

配置文件:

import redis
from flask_sqlalchemy import SQLAlchemy
# 创建db对象
db = SQLAlchemy()
class Config(object):
    DEBUG = True
    SECRET_KEY = "*(%#4sxcz(^(#$#8423"
    # 数据库链接配置:
    #数据类型://登录账号:登录密码@数据库主机IP:数据库访问端口/数据库名称
    SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/flask_students"
    # 设置mysql的错误跟踪信息显示
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    # 打印每次模型操作对应的SQL语句
    SQLALCHEMY_ECHO = True

    """把session保存到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(host='127.0.0.1', port='6379')  # 用于连接redis的配置

    SESSION_TYPE= 'sqlalchemy'          # session的存储方式为sqlalchemy
    SESSION_SQLALCHEMY= db             # SQLAlchemy对象
    SESSION_SQLALCHEMY_TABLE= 'sessions'      # session要保存的表名称
    SESSION_PERMANENT= True          # 如果设置为True,则关闭浏览器session就失效。
    SESSION_USE_SIGNER= False         # 是否对发送到浏览器上session的cookie值进行加密
    SESSION_KEY_PREFIX= 'session:'      # 保存到session中的值的前缀

 

 

启动文件main.py

from flask import Flask
from config import Config,db
from flask_session import Session

from flask import session

app = Flask(__name__,template_folder='templates')
app.config.from_object(Config)

# 把app加载到db对象中
db.init_app(app)

Session(app)

@app.route("/")
def index():
    return "ok"

@app.route("/set_session")
def set_session():
    """设置session"""
    session["username"] = "小明"
    return "ok"

if __name__ == '__main__':
    # db.create_all()
    print( app.url_map )
    app.run()

 

 

标签:BluePrint,__,users,Flask,app,蓝图,Blueprint,session
来源: https://www.cnblogs.com/lucky-cat233/p/14459871.html