flask中的藍圖與紅圖

內容:html

1.flask中的藍圖web

2.flask子域名實現正則表達式

3.flask中的紅圖flask

 

 

1.flask中的藍圖瀏覽器

一個大型項目中視圖比較多,若是僅僅是寫在app.py中不方便管理,藍圖就能夠作到分功能分目錄結構app

(1)什麼是藍圖dom

藍圖:用於實現單個應用的視圖、模板、靜態文件的集合。模塊化

藍圖就是模塊化處理的類函數

簡單來講,藍圖就是一個存儲操做路由映射方法的容器,主要用來實現客戶端請求和URL相互關聯的功能。 在Flask中,使用藍圖能夠幫助咱們實現模塊化應用的功能。測試

藍圖的功能:

  • 批量url
  • 自定義模板路徑/靜態文件路徑
  • 請求擴展:針對app、針對某個藍圖

 

(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')

注意:

  • 前提須要給配置SERVER_NAME: app.config['SERVER_NAME'] = 'wyb666.com:5000'
  • 訪問時:admin.wyb666.com:5000/login.html

 

 

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

相關文章
相關標籤/搜索