Tornado+Flask-Python web框架的使用
來源:未知 時間:2018-15-8 瀏覽次數:253次
Tornado+Flask-Python web框架的使用,本文從框架介紹,框架對比及框架使用等三個方面介紹
1、Web框架介紹
瀏覽器上網的過程簡單來說就是客戶端和服務器的交互過程,在物理服務器上運行著服務器程序,永久地等待客戶端(主要是瀏覽器,比如Chrome,Firefox等)發送請求。通常服務器程序包含了 Web服務器和Web應用兩部分,Web服務器接收客戶端的請求后,由Web應用對瀏覽器的請求進行處理,將生成的響應傳遞給Web服務器,再由Web服務器返回給客戶端。
為了簡化Web應用的開發,使開發者可以專注于編寫業務邏輯代碼而無需關心Web應用內各模塊連接之類的重復性工作,繼而在Web應用上產生了Web框架。一般Web框架的架構如下圖所示,基于Python的Web框架如Django、tornado、flask、webpy等都在這個范圍內進行不同的調整。如何在建立的Web服務器上運行一個Django應用或Flask應用,而無需對這些web框架或Web服務器做任何改變?WSGI協議可將web框架和web服務器分開,開發者可選擇適合自己的配對,混合匹配web框架和web服務器,對于服務器和框架開發者提供便利使他們可以專注于自己偏愛的領域和專長而不至于相互牽制。
這里我們把WSGI、uwsgi、uWSGI這幾個概念整理下:
WSGI(Web Server Gateway Interface)是為Python定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口協議,主要包括服務器和應用程序兩部分,是描述了web服務器如何與web應用程序通信的規范。
uwsgi基于二進制的線路協議,與WSGI通信協議作用相同,屬于uWSGI服務器的獨占協議,用于定義傳輸信息的類型(type of information)。
uWSGI是一個web服務器,實現了WSGI協議、uwsgi協議、http協議等。
2、Django、Tornado和Flask框架對比
在Python的web開發框架中,目前使用量最高的有Django、Flask和Tornado, 經常會有人拿這幾個對比,相信大家的初步印象應該是 Django大而全、Flask小而精、Tornado性能高。
Django是Python 中最全能的 web 開發框架,走大而全的方向。它最出名的是其全自動化的管理后臺:只需要使用起ORM,做簡單的對象定義,它就能自動生成數據庫結構、以及全功能的管理后臺。不過Django提供的方便,也意味著Django內置的ORM跟框架內的其他模塊耦合程度高,深度綁定了該框架,應用程序必須使用Django內置的ORM,否則就不能享受到框架內提供的種種基于其ORM的優秀特性。
Tornado全稱Tornado Web Server,是一個用Python語言寫成的Web服務器兼Web應用框架。Tornado走的是少而精的方向,注重的是性能優越,它最出名的是異步非阻塞的服務器方式。(Tornado框架和服務器一起組成一個WSGI的全棧替代品。單獨在WSGI容器中使用tornado web框架或者tornaod http服務器,有一定的局限性,為了最大化的利用tornado的性能,推薦同時使用tornaod的web框架和HTTP服務器。)
Flask是一個使用 Python 編寫的輕量級 Web 應用框架,也被稱為 “microframework”,語法簡單,部署很方便,整個框架自帶了路徑映射、模板引擎(Jinja2)、簡單的數據庫訪問等web框架組件,支持WSGI協議(采用 Werkzeug)。Flask使用 BSD 授權。 Flask使用簡單的核心,用 extension 增加其他功能,雖然沒有默認使用的數據庫、窗體驗證工具,然而Flask保留了擴增的彈性,可以用Flask-extension加入ORM、窗體驗證工具、文件上傳、各種開放式身份驗證技術這些功能。
從性能上看Tornado 比Django、Flask等主流 Web 服務器框架相比有著明顯的區別:它是非阻塞式服務器,速度相當快。然而 Tornado 相比 Django 和Flask屬于較為原始的框架,插件少,許多內容需要自己去處理。而Flask插件多,文檔非常專業,有專門的公司團隊維護,對于快速開發很有效率。由于WSGI協議的存在,可以結合 Tornado 的服務器異步特性、并發處理能力和Flask的文檔和擴展能力為一體。雖然像Django,Flask框架都有自己實現的簡單的WSGI服務器,但一般用于服務器調試,生產環境下建議用其他WSGI服務器,比如Nginx+uwsgi+Django方式。
Tornado關于使用平臺的說明:
Tornado should run on any Unix-like platform, although for the best performance and scalability only Linux (with epoll) and BSD (with kqueue) are recommended for production deployment (even though Mac OS X is derived from BSD and supports kqueue, its networking performance is generally poor so it is recommended only for development use). Tornado will also run on Windows, although this configuration is not officially supported and is recommended only for development use.
Tornado應該運行在類Unix平臺,在線上部署時為了最佳的性能和擴展性,僅推薦Linux和BSD(因為充分利用Linux的epoll工具和BSD的kqueue工具,是Tornado不依靠多進程/多線程而達到高性能的原因)。對于Mac OS X,雖然也是衍生自BSD并且支持kqueue,但是其網絡性能通常不太給力,因此僅推薦用于開發。對于Windows,Tornado官方沒有提供配置支持,但是也可以運行起來,不過僅推薦在開發中使用。
3、Tornado+ Flask實現方式
(1)首先,我們導入了 Flask 類,這個類的實例將會是我們的 WSGI 應用程序。
from flask import Flask
(2)接下來,我們創建一個該類的實例app,第一個參數是應用模塊或者包的名稱。 如果使用單一的模塊(如本例),應該使用 name ,因為模塊的名稱將會因其作為單獨應用啟動還是作為模塊導入而有不同( 也即是 ‘main’ 或實際的導入名)。這是必須的,這樣 Flask 才知道到哪去找模板、靜態文件等等。
app = Flask(__name__)
(3)然后,我們使用route()裝飾器把一個函數綁定到對應的URL上,告訴 Flask什么樣的URL能觸發我們的函數。 這個函數的名字也在生成URL時被特定的函數采用,這個函數返回我們想要顯示在用戶瀏覽器中的信息。
@app.route('/', methods=['GET'])
def index(name = None):
if request.method == 'GET':
name = "WEB SERVER"
return render_template('index.html',name=name)
(4)最后我們用 run() 函數來讓應用運行在本地服務器上。 if name == ‘main’: 確保服務器只會在該腳本被 Python 解釋器直接執行的時候才會運行,而不是作為模塊導入的時候。
if __name__ == '__main__':
try:
app.run(host='0.0.0.0', port=80, debug=False)
except:
pass
(5)外部可訪問的服務器。如果你運行了這個服務器(app.run()),你會發現它只能從你自己的計算機上訪問,網絡中其它任何的地方都不能訪問。在調試模式下,用戶可以在你的計算機上執行任意 Python 代碼。因此,這個行為是默認的。如果你禁用了 debug 或信任你所在網絡的用戶,你可以簡單修改調用 run() 的方法使你的服務器公開可用,如下:app.run(host=‘0.0.0.0’)這會讓操作系統監聽所有公網 IP。
(6)雖然 run() 方法適用于啟動本地的開發服務器,但是你每次修改代碼后都要手動重啟它。這樣并不夠優雅,而且 Flask 可以做到更好。如果你啟用了調試支持,服務器會在代碼修改后自動重新載入,并在發生錯誤時提供一個相當有用的調試器。有兩種途徑來啟用調試模式。一種是直接在應用對象上設置:
app.debug = True
app.run()
另一種是作為 run 方法的一個參數傳入:
app.run(debug=True)
兩種方法的效果完全相同。
(1)用Python 生成 HTML 十分無趣,而且相當繁瑣,因為你必須手動對 HTML 做轉義來保證應用的安全。為此,Flask 配備了 Jinja2 模板引擎。你可以使用 render_template() 方法來渲染模板。你需要做的一切就是將模板名和你想作為關鍵字的參數傳入模板的變量。這里有一個展示如何渲染模板的簡例:
from flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
Flask 會在 templates 文件夾里尋找模板。所以,如果你的應用是個模塊,這個文件夾應該與模塊同級;如果它是一個包,那么這個文件夾作為包的子目錄:
情況 1: 模塊:
/application.py
/templates
/hello.html
情況 2: 包:
/application
/init.py
/templates
/hello.html
在Tornado中,我們可以通過wsgi模塊下的WSGIContainer類運行其他WSGI應用的,例如Flask、Bottle、Django應用。
(1)創建了一個HTTP服務器實例http_server,因為服務器要服務于我們剛剛建立的web應用,將接收到的客戶端請求通過web應用中的路由映射表引導到對應的handler中,所以在構建http_server對象的時候需要傳入web應用對象app。可以使用自身的web框架, 如果使用托管的應用,將要托管的應用以參數的形式傳入到WSGIContainer類中。
http_server = HTTPServer(WSGIContainer(app))
(2)緊接著,我們定義這個服務器監聽的端口,將服務器綁定到80端口。
http_server.listen(80)
(3)IOLoop 是 Tornado 的核心I/O循環調度模塊,也是tornado高性能的基石,封裝了Linux的epoll和BSD的kqueue,用于處理 socket 相關的連接、響應、異步讀寫等網絡事件。每個 Tornado 進程都會初始化一個全局唯一的 IOLoop 實例,在 IOLoop 中通過靜態方法 instance() 進行封裝,獲取 IOLoop 實例直接調用此方法即可啟動 IOLoop 實例,即啟動事件循環機制,配合非阻塞的 HTTP Server 工作。
如果是tornado.ioloop.IOLoop.current().start()語句,IOLoop.current()返回當前線程的IOLoop實例。IOLoop.start()啟動IOLoop實例的I/O循環,同時服務器監聽被打開。
- 上一篇: 大數據經典案例分析
- 下一篇: URL是什么意思,為什么URL地址,對SEO很重要?

掃一掃