1. 程式人生 > >Flask 中模組化應用的實現

Flask 中模組化應用的實現

Flask是一個輕量級的Web框架。雖然是輕量級的,但是對於元件一個大型的、模組化應用也是能夠實現的,“藍圖”就是這樣一種實現。對於模組化應用的實現,在Flask 0.2版本中進行了設計。本文暫時不對“藍圖”做詳細的介紹,而是先從0.2版本中的Module類的實現講起。其實,“藍圖”的實現和Module類的實現很相似。

為什麼實現模組化應用

對於大型應用而言,隨著功能的不斷增加,整個應用的規模也會擴大。按照一定的規則將應用的不同部分進行模組化,不僅能夠使整個應用邏輯清晰,也易於維護。例如,在Flask中,你也許想像如下構建一個簡單的專案:

Python
123456 /myapplication/__init__.py/views/__init__.py/admin.py/frontend.py

以上目錄結構中,我們將之前的Flask單檔案修改成了一個應用包,所有的檢視函式都在views下,並且按照功能分為了adminfrontend兩個部分。為了實現這種模組化應用的構建,在0.2版本中Flask實現了Module類。這個類例項可以通過註冊的方式,在Flask應用建立後新增進應用。

Module類實現了一系列的方法:

  • route(rule, **options)
  • add_url_rule(rule, endpoint, view_func=None, **options)
  • before_request(f)
  • before_app_request(f)
  • after_request(f)
  • after_app_request(f)
  • context_processor(f)
  • app_context_processor(f)
  • _record(func)

以上方法除了add_url_rule_record外,都可以作為裝飾器在自己的模組中使用,這些裝飾器都返回一個函式。通過呼叫_record方法,可以將裝飾器返回的函式放到_register_events

中。當Flask應用建立之後,通過執行_register_events列表中的函式,可以將這個模組註冊到應用中去。

Flask應用怎麼註冊一個Module

以下我們以一個例子來說明Flask應用怎麼註冊一個Module

1. 專案結構

這個簡單的例子專案結構如下:

Python
1234567 /myapplication/__init__.py/app.py/views/__init__.py/admin.py/blog.py

admin.pyblog.py兩個模組的程式碼如下:

Python
123456789 # admin.pyfromflask importModuleadmin=Module(__name__)@admin.route('/')defindex():return"This is admin page!"@admin.route('/profile')defprofile():return"This is profile page."
Python
123456789 # blog.pyfromflask importModuleblog=Module(__name__)@blog.route('/')defindex():return"This is my blog!"@blog.route('/article/<int:id>')defarticle(id):return"The article id is %d."%id

以上兩個模組中,我們首先分別建立了一個Module類,然後像寫一般的檢視函式一樣,為每個模組增加一些規則。之後,可以在建立Flask應用的時候將這些模組引入,就可以註冊了。

Python
12345678910111213 # app.pyfromflask importFlaskfromviews.admin importadminfromviews.blog importblogapp=Flask(__name__)@app.route('/')defindex():return"This is my app."app.register_module(blog,url_prefix='/blog')app.register_module(admin,url_prefix='/admin')if__name__=='__main__':fromwerkzeug.serving importrun_simplerun_simple('localhost',5000,app)

app.py中:

  • 我們首先引入了adminblog兩個Module物件;
  • 之後,我們建立了一個Flask應用app,並且為這個應用增加了一個檢視函式;
  • 為了註冊模組,我們呼叫了應用的register_module方法;
  • 最後,從werkzeug.serving中我們呼叫run_simple方法,用來建立一個本地的伺服器用於測試這個Flask應用。

根據以上的步驟,我們就可以測試這個應用。分別以/blog/admin為URL字首,就可以訪問blogadmin兩個模組了。

2. 註冊Module時發生了什麼

根據上面的例子,只要簡單的呼叫Flask應用的register_module方法,就可以註冊一個Module了。關於register_module方法的程式碼如下:

Python
12345678910 defregister_module(self,module,**options):"""Registers a module with this application.  The keyword argument    of this function are the same as the ones for the constructor of the    :class:`Module` class and will override the values of the module if    provided.    """options.setdefault('url_prefix',module.url_prefix)state=_ModuleSetupState(self,**options)forfunc inmodule._register_events:func(state)

通過以上程式碼可以發現:

  • 可以通過增加url_prefix來區分不同的Module,這在app註冊adminblog時我們已經看到了;
  • 在註冊時,我們建立了一個_ModuleSetupState的類,這個類接收Flask應用和一些引數生成一個state例項。這個例項反映了當前Flask應用的狀態。
  • 前面在講到Module類的時候,我們講到Module未註冊時會將自己模組的一些功能實現都放在_register_events列表中,這些功能實現都是函式形式。當需要將模組註冊到某一應用上時,只需要傳遞關於這個應用資訊的引數即可,即就是上面的state例項。這樣,通過執行函式,可以講一些屬性繫結到當前應用上去。

以上面例子中不同模組的URL繫結來講,通過註冊,應用app現形成了如下的URL“地圖”:

Python
1234567891011121314151617181920212223 >>>app.url_mapMap([<Rule'/admin/profile'(HEAD,GET)->admin.profile>,<Rule'/admin/'(HEAD,GET)->admin.index>,<Rule'/blog/'(HEAD,GET)->blog.index>,<Rule'/'(HEAD,GET)->index>,<Rule'/blog/article/<id>'(HEAD,GET)->blog.article>,<Rule'/static/<filename>'(HEAD,GET)->static>])>>>app.url_map._rules_by_endpoint{'admin.index':[<Rule'/admin/'(HEAD,GET)->admin.index>],'admin.profile':[<Rule'/admin/profile'(HEAD,GET)->admin.profile>],'blog.article':[<Rule'/blog/article/<id>'(HEAD,GET)->blog.article>],'blog.index':[<Rule'/blog/'(HEAD,GET)->blog.index>],'index':[<Rule'/'(HEAD,GET)->index>],'static':[<Rule'/static/<filename>'(HEAD,GET)->static>]}>>>app.view_functions{'admin.index':<function views.admin.index>,'admin.profile':<function views.admin.profile>,'blog.article':<function views.blog.article>,'blog.index':<function views.blog.index>,'index':<function __main__.index>}

這樣,就可以把不同模組的URL規則放在一起,並在endpoint和檢視函式之間形成對應關係。關於Flask應用中URL處理,可以參考:Flask應用中的URL處理

相關推薦

Flask 模組應用實現

Flask是一個輕量級的Web框架。雖然是輕量級的,但是對於元件一個大型的、模組化應用也是能夠實現的,“藍圖”就是這樣一種實現。對於模組化應用的實現,在Flask 0.2版本中進行了設計。本文暫時不對“藍圖”做詳細的介紹,而是先從0.2版本中的Module類的實現講起。其實,“

Flask --(30)Flask 郵件擴充套件的實現

郵件擴充套件 在開發過程中,很多應用程式都需要通過郵件提醒使用者,Flask的擴充套件包Flask-Mail通過包裝了Python內建的smtplib包,可以用在Flask程式中傳送郵件。 Flask-Mail連線到簡單郵件協議(Simple Mail Tran

java9第一個模組應用

本篇文章簡單的介紹了模組應用的開發,在這個過程中理解模組的概念以及模組的使用。 對於模組化的更強的封裝性以及更簡單的依賴的特性,當你把理解了模組時什麼東西之後自然而然就理解了。 需要宣告的是,為了更好的理解模組,本篇不使用任何IDE,直接使用命令列操作,廢話

es6模組:export和export default的區別

一個頁面中export default只有一個。 demo1.js export str="111111" demo2.js import {str} from 'demo1.j

Flask 用Blueprint實現模組應用

在一個大型專案中,肯定會有很多模組組成,比如一個網路管理系統可能有流量運營模組,實時分析模組,故障預警模組等。我們可以利用Flask Blueprint 實現每個模組的功能進行獨立的開發與管理,後

在Bootstrap開發框架的前端檢視使用@RenderPage實現頁面內容模組的隔離,減少複雜度

在很多開發的場景中,很多情況下我們需要考慮抽象、以及模組化等方面的內容,其目的就是為了使得開發的時候關注的變化內容更加少一些,整體開發更加簡單化,從而減少開發的複雜度,在Winform開發的時候,往往可以通過定義基類模組、使用者控制元件的方式實現這個目的,而在Web開發的時候,我們是否也可以利用這些特性呢?特

有表頭行與無表頭行的內表在模組應用(ABAP)

PROGRAM SAPMZTST. TYPES: BEGIN OF LINE,          COL1 TYPE I,          COL2 TYPE I,        END OF LINE. DATA: ITAB TYPE LINE OCCURS 10 WI

vue.jsvuex狀態管理的實現模組

本文采用的前端元件為ElementUI,所以需要在使用vuecli搭建前端工程,後繼續安裝npm install element-ui,並在main.js中引入 main.js程式碼: import Element from 'element-ui'; im

Androidapk動態載入技術研究(2)android插件實現

name creat package path iss fontsize 調用 dex con 了解了android中類載入的前期知識點後,來看看android中DexClassLoader詳細的實現 詳細載入流程例如以下: 宿主程序會到文件系統比

ssm redis 數據字典在J2EE的多種應用實現

stat ide ddk ucc gif ndt ida creat img 數據字典在項目中是不可缺少的“基礎設施”,關於數據字典如何設計如何實現,今天抽空講一下吧 先看一下表設計: 通過自定義標簽來實現頁面的渲染: public class DataDictVal

WTForms In Flask(WTForms在Flask應用)

lap xxxxx 打印 errors 子函數 self FN bject clr WTForms WTForms是一個支持多個web框架的form組件,主要用於對用戶請求數據進行驗證。 安裝wtforms : pip3/pip install wtforms

Flask的請求上下文和應用上下文

之前 none 如果 理念 返回值 自己的 .data 內置 .config  本文章粘貼自  https://blog.tonyseek.com/post/the-context-mechanism-of-flask/ 用過 Flask 做 Web 開發的同學應該不會不記

flask的藍圖與子域名實現

靜態 文件 執行 .com 實例 固定 span inf 取出 內容: 1.flask中的藍圖 2.flask子域名實現 1.flask中的藍圖 一個大型項目中視圖比較多,如果僅僅是寫在app.py中不方便管理,藍圖就可以做到分功能分目錄結構 (1)什麽是藍圖 藍圖

Flask的session ,自定義實現 session機制, 和 flask-session組件

time 基礎 如何 password pyc class 原理 less pan session 是基於cookie實現, 保存在服務端的鍵值對(形式為 {隨機字符串:‘xxxxxx’}), 同時在瀏覽器中的cookie中也對應一相同的隨機字符串,

React總結篇之四_模組React和Redux應用

建立一個複雜一點的應用應該如何做: 模組化應用的要點 程式碼檔案的組織方式 狀態數的設計 開發輔助工具 一、模組化應用的要點1.構建一個應用的基礎要做如下3件事情: 程式碼檔案的組織結構 確定模組的邊界 store的狀態樹設計 程式碼檔案的組織方式:按功

flask+SQLAlchemy使用blueprint模組

flask使用blueprint模組化 原來我們的flask程式是寫在一個檔案裡的,但是這非常不利於python的程式碼模組化以及程式碼優美的作用,所以當代碼越寫越長時,模組化的需求就產生了。 經過多次踩坑以及藉助谷歌大法實現了原始碼的模組化,整理了一下單檔案重構的方式,現在整理出來

vue-router 在模組 vue的使用

注意:vue-router 2只適用於Vue2.x版本,下面我們是基於vue2.0講的如何使用vue-router 2實現路由功能。 推薦使用npm安裝。 npm install vue-router 一、使用路由 在main.js中,需要明確安裝路由功能: import Vue

人生第一篇部落格——Tensorflow.hub模組應用圖片分類的重訓練(源於文件原始碼)

1. tf.gfile.LIstDirectory(filename) 返回資料夾(filename)的列表,類似於listdir,子資料夾只會返回資料夾名。 2. tf.image.decode_jpeg(jpeg_data,channels = depth) jpeg_data = tf.

flask的上下文_請求上下文和應用上下文

前引   在瞭解flask上下文管理機制之前,先來一波必知必會的知識點。 面向物件雙下方法   首先,先來聊一聊面向物件中的一些特殊的雙下劃線方法,比如__call__、__getattr__系列、__getitem__系列。   __call__   這個方法相信大家並不陌生,在單例模式中,我們可

C# MVC按照業務建立多模組web應用程式(UI)

如果想要UI層根據業務進行模組劃分,UI層釋出的時候能達到UI層根據業務單獨打包成dll檔案, 可以在解決方案中將DataObj、DAL、BLL、UI均放在解決方案資料夾下: 1、DataObj根據業務按照模組建立對應的類庫,釋出的時候各個業務模組的DataObj.dll分開,以減低耦合