转载请在文章开头附上原文连接地址:http://www.javashuo.com/article/p-poazsueb-dw.htmlhtml
随着flask程序愈来愈复杂,咱们须要对程序进行模块化的处理,以前学习过python的模块化管理,因而针对一个简单的flask程序进行模块化处理python
简单来讲,Blueprint 是一个存储视图方法的容器,这些操做在这个Blueprint 被注册到一个应用以后就能够被调用,Flask 能够经过Blueprint来组织URL以及处理请求。mysql
Flask使用Blueprint让应用实现模块化,在Flask中,Blueprint具备以下属性:redis
可是一个Blueprint并非一个完整的应用,它不能独立于应用运行,而必需要注册到某一个应用中。sql
Blueprint对象用起来和一个应用/Flask对象差很少,最大的区别在于一个 蓝图对象没有办法独立运行,必须将它注册到一个应用对象上才能生效数据库
使用蓝图能够分为四个步骤flask
__init__.py
文件中建立蓝图对象users=Blueprint('users',__name__)
@admin.route('/') def home(): return 'user.home'
from flask import Blueprint # 等同于原来在 manage.py里面的 app = Flask() users=Blueprint('users',__name__) from .views import *
from users import users app.register_blueprint(users,url_prefix='/users')
当这个应用启动后,经过/users/能够访问到蓝图中定义的视图函数浏览器
url_for('users.home') # /users/home
和应用对象不一样,蓝图对象建立时不会默认注册静态目录的路由。须要咱们在 建立时指定 static_folder 参数。cookie
下面的示例将蓝图所在目录下的static_users目录设置为静态目录session
# 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 来改变静态目录的路由。
下面的示例将为 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 :
admin = Blueprint('admin',__name__,template_folder='templates_users')
注:若是在 templates 中存在和 templates_users 有同名模板文件时, 则系统会优先使用 templates 中的文件
分析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()