Flask入門到放棄(五)—— 藍圖

轉載請在文章開頭附上原文連接地址:http://www.javashuo.com/article/p-poazsueb-dw.htmlhtml

藍圖 Blueprint

模塊化

隨着flask程序愈來愈複雜,咱們須要對程序進行模塊化的處理,以前學習過python的模塊化管理,因而針對一個簡單的flask程序進行模塊化處理python

簡單來講,Blueprint 是一個存儲視圖方法的容器,這些操做在這個Blueprint 被註冊到一個應用以後就能夠被調用,Flask 能夠經過Blueprint來組織URL以及處理請求。mysql

Flask使用Blueprint讓應用實現模塊化,在Flask中,Blueprint具備以下屬性:redis

  • 一個項目能夠具備多個Blueprint
  • 能夠將一個Blueprint註冊到任何一個未使用的URL下好比 「/」、「/sample」或者子域名
  • 在一個應用中,一個模塊能夠註冊屢次
  • Blueprint能夠單獨具備本身的模板、靜態文件或者其它的通用操做方法,它並非必需要實現應用的視圖和函數的
  • 在一個應用初始化時,就應該要註冊須要使用的Blueprint

可是一個Blueprint並非一個完整的應用,它不能獨立於應用運行,而必需要註冊到某一個應用中。sql

Blueprint對象用起來和一個應用/Flask對象差很少,最大的區別在於一個 藍圖對象沒有辦法獨立運行,必須將它註冊到一個應用對象上才能生效數據庫

使用藍圖能夠分爲四個步驟flask

  1. 建立一個藍圖的包,例如users,並在__init__.py文件中建立藍圖對象
users=Blueprint('users',__name__)
  1. 在這個藍圖目錄下, 建立views.py文件,保存當前藍圖使用的視圖函數
@admin.route('/')
def home():
    return 'user.home'
  1. users/init.py中引入views.py中全部的視圖函數
from flask import Blueprint
# 等同於原來在 manage.py裏面的 app = Flask()
users=Blueprint('users',__name__)

from .views import *
  1. 在主應用main.py文件中的app對象上註冊這個users藍圖對象
from users import users
app.register_blueprint(users,url_prefix='/users')

當這個應用啓動後,經過/users/能夠訪問到藍圖中定義的視圖函數瀏覽器

運行機制

  • 藍圖是保存了一組未來能夠在應用對象上執行的操做,註冊路由就是一種操做
  • 當在app對象上調用 route 裝飾器註冊路由時,這個操做將修改對象的url_map路由表
  • 然而,藍圖對象根本沒有路由表,當咱們在藍圖對象上調用route裝飾器註冊路由時,它只是在內部的一個延遲操做記錄列表defered_functions中添加了一個項
  • 當執行app對象的 register_blueprint() 方法時,應用對象將從藍圖對象的 defered_functions 列表中取出每一項,並以自身做爲參數執行該匿名函數,即調用應用對象的 add_url_rule() 方法,這將真正的修改應用對象的usr_map路由表

藍圖的url前綴

  • 當咱們在應用對象上註冊一個藍圖時,能夠指定一個url_prefix關鍵字參數(這個參數默認是/)

  • 在應用最終的路由表 url_map中,在藍圖上註冊的路由URL自動被加上了這個前綴,這個能夠保證在多個藍圖中使用相同的URL規則而不會最終引發衝突,只要在註冊藍圖時將不一樣的藍圖掛接到不一樣的自路徑便可
  • url_for在使用時,若是要生成一個藍圖裏面的視圖對應的路由地址,則須要聲明當前藍圖名稱+視圖名稱
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 中的文件

調整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()
相關文章
相關標籤/搜索