Flask源碼分析01:框架簡介

Flask是怎麼樣的框架

Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI(Python Web Server Gateway Interface)工具箱採用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 受權。
Flask也被稱爲 「microframework」 ,由於它使用簡單的核心,用 extension 增長其餘功能。Flask沒有默認使用的數據庫、窗體驗證工具
中文參考文檔地址html

python 語言 web 框架不少:Django、Tornado、webpy、bottle……,flask 的特色是簡單可擴展。簡單有幾個方面,好比它只實現 web 框架最核心的功能,保持功能的簡潔;還有一個就是代碼量少,核心代碼 app.py 文件只有 2k+ 行。可擴展就是容許第三方插件來擴充功能,好比數據庫可使用 Flask-SQLAlchemy,緩存可使用 Flask-Cache 等等。
下面這段代碼是 flask 官方文檔給出的 hello world 版本的 flask 應用:python

from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    return 'Hello, World!'
 
if __name__ == '__main__':
    app.run()

要理解 flask 的源碼,必須有必定的 python 基礎(對 decorator、magic method、iterator、generator 概念比較熟悉),否則的話,會有些吃力。另一個必須理解的概念是 WSGI,簡單來講就是一套 web server 和 web 框架/web 應用之間的協議。能夠閱讀我以前寫的 python wsgi 簡介 和翻譯的 什麼是 web 框架 ,或者自行搜索相關資料,熟悉這部分的內容。web

兩個依賴

flask 有兩個核心依賴庫:werkzeugjinja2,而 werkzeug 又是二者中更核心的。數據庫

werkzeug 負責核心的邏輯模塊,好比路由、請求和應答的封裝、WSGI 相關的函數等;jinja2 負責模板的渲染,主要用來渲染返回給用戶的 html 文件內容。json

模板(template)是和 web 框架相對獨立的內容,好比 jinja 不是隻能用在 web 應用中,而 web 應用也能夠不處理模板(好比返回 raw text 或者 json/xml 結構數據,而不是 html 頁面)。flask 直接使用 jinja2 而不是把這部分也作成可擴展的看起來有悖它的設計原則,我我的的理解是:flask 是個寫網頁的 web 框架,不像 flask-restful 能夠專門作 json/xml 數據接口,必須提供模板功能,否則用戶就沒法使用。而若是不綁定一個模板庫的話,有三種方法:本身寫一個模板引擎、封裝一個可擴展的模板層,用戶能夠本身選擇具體的模板引擎、或者讓用戶本身處理模板。可是這些方法要麼增長實現的複雜度,要麼增長了使用的複雜度。flask

2.1 werkzeug

werkzeug 的定位並非一個 web 框架,而是 HTTP 和 WSGI 相關的工具集,能夠用來編寫 web 框架,也能夠直接使用它提供的一些幫助函數。緩存

Werkzeug is an HTTP and WSGI utility library for Python.restful

werkzeug 提供了 python web WSGI 開發相關的功能:數據結構

  • 路由處理:怎麼根據請求中的 url 找到它的處理函數
  • request 和 response 封裝:能夠更好地讀取 request 的數據,也容易生成響應
  • 一個自帶的 WSGI server,能夠用來測試環境運行本身的應用

好比,咱們可使用 werkzeug 編寫一個簡單的 hello world 的 WSGI app:app

from werkzeug.wrappers import Request, Response
 
def application(environ, start_response):
    request = Request(environ)
    text = 'Hello %s!' % request.args.get('name', 'World')
    response = Response(text, mimetype='text/plain')
    return response(environ, start_response)

除了和 web WSGI 相關的功能,werkzeug 還實現了不少很是有用的數據結構和函數。好比用來處理一個 key 對應多個值的 MultiDict,不支持修改的字典 ImmutableDict ,能夠緩存類屬性的 cache_property 等等。若是有機會,能夠寫篇文章講講 werkzeug 的源碼(好吧,我又挖坑了)。

2.2 Jinja2

官網上,對 Jinja2 的 介紹已經很清晰,它就是一個 python 實現的模板引擎,功能很是豐富。

Jinja2 is a full featured template engine for Python. It has full unicode support, an optional integrated sandboxed execution environment, widely used and BSD licensed.

Jinja 功能比較豐富,支持 unicode 解析、自動 HTML escape 防止 XSS 攻擊、繼承、變量、過濾器、流程邏輯支持、python 代碼邏輯集成等等。具體的功能和使用請參考官網的文檔,這裏就不介紹了。

相關文章
相關標籤/搜索