轉載請在文章開頭附上原文連接地址: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()