內容:html
1.flask中的藍圖web
2.flask子域名實現正則表達式
3.flask中的紅圖flask
1.flask中的藍圖瀏覽器
一個大型項目中視圖比較多,若是僅僅是寫在app.py
中不方便管理,藍圖就能夠作到分功能分目錄結構app
(1)什麼是藍圖dom
藍圖:用於實現單個應用的視圖、模板、靜態文件的集合。模塊化
藍圖就是模塊化處理的類函數
簡單來講,藍圖就是一個存儲操做路由映射方法的容器,主要用來實現客戶端請求和URL相互關聯的功能。 在Flask中,使用藍圖能夠幫助咱們實現模塊化應用的功能。測試
藍圖的功能:
(2)藍圖的運行機制
藍圖是保存了一組未來能夠在應用對象上執行的操做。
註冊路由就是一種操做,當在程序實例上調用route裝飾器註冊路由時,這個操做將修改對象的url_map路由映射列表。當咱們在藍圖對象上調用route裝飾器註冊路由時,它只是在內部的一個延遲操做記錄列表defered_functions中添加了一個項。
當執行應用對象的 register_blueprint() 方法時,應用對象從藍圖對象的 defered_functions 列表中取出每一項,即調用應用對象的 add_url_rule() 方法,這將會修改程序實例的路由映射列表
(3)藍圖基本使用
首先在views包下的user.py建立藍圖並註冊藍圖路由:
1 from flask import redirect, render_template, Blueprint 2 3 main = Blueprint('user', __name__) 4 5 @main.route('/index') 6 def index(): 7 return "index"
注意:藍圖的名字千萬不要與你下面的視圖函數的名字重複,不然沒法導入藍圖,程序報錯!
而後在app.py中實例化註冊該路由:
1 from flask import Flask 2 from views.user import main as route_user 3 4 app = Flask(__name__) 5 6 # 將藍圖註冊到app: 7 app.register_blueprint(route_user, url_prefix="/user") 8 9 10 if __name__ == '__main__': 11 print(app.url_map) 12 app.run(debug=True, host='localhost')
注意url_prefix是給註冊的藍圖添加路由前綴
(4)藍圖應用
藍圖簡單程序目錄結構:
run.py:
1 from pro_flask import app 2 3 if __name__ == '__main__': 4 app.run()
pro_flask下的__init__.py:
1 from flask import Flask 2 3 app = Flask(__name__, template_folder='templates', static_folder='statics', static_url_path='/static') 4 5 from .views.account import account 6 from .views.blog import blog 7 from .views.user import user 8 9 app.register_blueprint(account) 10 app.register_blueprint(blog) 11 app.register_blueprint(user)
views下的user.py:
1 from flask import Blueprint 2 3 user = Blueprint('user', __name__) 4 5 6 @user.route("/index") 7 def index(): 8 return "index"
藍圖複雜程序目錄結構:
run.py:
1 from pro_flask import app 2 3 if __name__ == '__main__': 4 app.run()
pro_flask下的__init__.py:
1 from flask import Flask 2 from .admin import admin 3 from .web import web 4 5 app = Flask(__name__) 6 app.debug = True 7 8 app.register_blueprint(admin, url_prefix='/admin') 9 app.register_blueprint(web)
應用以web爲例,admin同理:
web應用下的__init__.py:
1 from flask import Blueprint 2 3 web = Blueprint( 4 'web', 5 __name__, 6 template_folder='templates', # 指定應用本身的模板文件路徑
7 static_folder='static' # 指定應用本身的靜態文件路徑 8 ) 9 from . import views
web應用下的views.py:
1 from . import web 2 3 @web.route('/index') 4 def index(): 5 return 'Web.Index'
2.flask子域名實現
(1)什麼是子域名
子域名相似xxx.douban.com的形式,好比book.douban.com、movie.douban.com、music.douban.com、time.douban.com
(2)flask子域名實現
1 # __author__ = "wyb" 2 # date: 2018/8/31 3 4 from flask import Flask 5 6 app = Flask(import_name=__name__) 7 app.config['SERVER_NAME'] = 'wyb666.com:80' 8 9 10 # 子域名 -> xxx.wyb666.com 11 # 靜態子域名 -> xxx是固定的 12 # subdomain指定子域名 13 @app.route("/", subdomain="admin") 14 def static_index(): 15 """ 16 Flask supports static subdomains 17 This is available at static.your-domain.tld 18 """ 19 return "static.your-domain.tld" 20 21 22 # 動態子域名 -> xxx不是固定的 23 # subdomain指定子域名(下面的<username>相似正則表達式) 24 @app.route("/dynamic", subdomain="<username>") 25 def username_index(username): 26 """ 27 Dynamic subdomains are also supported 28 Try going to username.your-domain.tld/dynamic 29 """ 30 return username + ".your-domain.tld" 31 32 33 if __name__ == '__main__': 34 app.run()
(3)本地如何測試
上述程序運行後在瀏覽器中輸入admin.wyb666.com將出現以下畫面:
這是因爲DNS解析的緣由,DNS解析能夠大體理解爲訪問一個網站,輸入網址後將解析成IP地址訪問 (域名->IP地址)
本地flask程序運行的IP是127.0.0.1,這裏並無對應關係,在Windows中能夠經過修改host來實現添加或改變這個對應關係
在本地運行,本地訪問時要修改host文件,將上述的子域名與127.0.0.1對應:
1 127.0.0.1 www.wyb666.com 2 127.0.0.1 admin.wyb666.com 3 127.0.0.1 wyb.wyb666.com 4 、、、
而後運行程序再訪問就能夠了:
(4)藍圖子域名實現
固然上面的方法實際上在項目中用到的不多,通常大型項目毫無疑問要使用到藍圖來搭建項目結構,一樣藍圖也能夠實現子域名:
藍圖子域名:xxx = Blueprint('account', __name__, subdomain='admin')
注意:
3.flask中的紅圖
(1)什麼是紅圖
藍圖是模塊級別的拆分,它不是設計來讓你拆分視圖函數的。
要實現比模塊級別下更具體的視圖函數的拆分,例如在用Flask製做REST API時版本號下根據不一樣業務對象的函數拆分時,咱們就須要自定義一個跟藍圖功能相同的模塊。在這裏,爲了體現它跟藍圖的殊途同歸之妙,咱們將它命名爲紅圖!
如圖所示:
(2)紅圖實現
實現Redprint,主要是參考blueprint的源碼(原理)進行一些改造,以下所示:
1 class Redprint: 2 def __init__(self, name): 3 self.name = name 4 self.mound = [] 5 6 def route(self, rule, **options): 7 def decorator(f): 8 self.mound.append((f, rule, options)) 9 return f 10 return decorator 11 12 def register(self, bp, url_prefix=None): 13 if url_prefix is None: 14 url_prefix = '/' + self.name 15 for f, rule, options in self.mound: 16 endpoint = options.pop("endpoint", f.__name__) 17 bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
(3)詳細原理與使用方法
詳細推薦看此:https://blog.csdn.net/wang6821906/article/details/81437608