1. 程式人生 > >Django 、 Flask 、 Pyramid框架對比

Django 、 Flask 、 Pyramid框架對比

1                         前言

Pyramid,Django和Flask都是非常不錯的Web框架,如何為你的專案從中選擇最合適的是一個問題。本文中,會使用這三個Web框架來實現具備同一個功能的網站,以此來進行對比。

2                        簡介

PythonWeb框架的世界裡總是充滿著選擇,Django,Flask,Pyramid,Tornado,Bottle,Diesel,Pecan,Falcon和其他各式各樣的框架擺在開發者的眼前。作為一個開發者,你需要能夠從中選出一款適合你的能幫助你完成專案的框架。本文中,我們把注意力集中到Flask,Pyramid和Django上。

我們將使用這三款框架去構建同樣一個應用並且對比程式碼,體現出每種框架的優勢和劣勢。如果你想直接看程式碼,請點選https://github.com/ryansb/wut4lunch_demos

Flask是一個“微型”框架,主要關注一些簡單的應用。Pyramid和Django都是關注大型應用的框架,但是使用不同的方法來達到不同的擴充套件性和靈活性。Pyramid關注靈活性,讓開發者為自己的專案自主選擇合適的工具。這意味著開發者可以選擇資料庫、URL架構、模板風格等等。Django注重將一個web應用所需的所有模組都包括進來,開發者只需要直接使用該框架進行工作即可。

Django預設自帶ORM,而Pyramid和Flask讓開發者自行去選擇如何儲存資料。非Django的web應用最常使用的ORM是SQLAlchemy。當然還有其他眾多的選擇,如DynamoDB和MongoDB、LevelDB、SQLite等。

3                         關於框架

 

Django自帶所有所需模組的模式使得開發者能夠非常容易地直接關注web應用開發本身,而不需要去做很多關於應用架構如何設計的決定。Django內嵌了模板、表單、路由、認證、基本資料庫管理等模組。Pyramid包括路由和認證,但是模板和資料庫管理則需要額外的庫。

Flask,三個框架中最年輕的一個,始於2010年中。Pyramid框架出自Pylons,在2010年末得名,最早的一個版本是在2005年。Django在2006年釋出第一個版本,就在Pylons剛開始的時候。Pyramid和Django都是非常成熟的框架,有相當多的外掛和擴充套件模組來滿足各類需求。

雖然Flask更年輕一些,但其更有機會去學習之前的框架並把自己的關注點放到了小專案上。其經常被只有一兩個功能的小專案使用,比如httpbin,http://httpbin.org/,一個簡單但是強力的除錯和測試HTTP的庫。

 

4                         社群

 從StackOverflow上各個框架相關的問題數量就可以看出哪個框架更加受歡迎了。

5                         載入程式

Django和Pyramid都內嵌各自的載入程式。Flask並未內嵌的原因是其使用者並不會使用Flask去開發大型的MVC應用。

5.1                     Flask

7行程式碼就可以組成一個基於Flask的Hello World應用。

[python]  view plain  copy
  1. # from http://flask.pocoo.org/ tutorial  
  2. from flask import Flask  
  3. app = Flask(__name__)  
  4.  
  5. @app.route("/"# take note of this decorator syntax, it's a common pattern  
  6. def hello():  
  7.     return "Hello World!"  
  8.   
  9. if __name__ == "__main__":  
  10.     app.run()  

這就是Flask沒有內嵌載入程式的原因了:沒有這樣的需求。

基於上面這個例子,這是一個已經可以執行的基於Flask的網站了。因此,甚至一個沒有開發過Python Web應用的開發者都可以直接開始開發了。

對於那些不同功能元件 需要分割的專案,Flask有blueprints機制。例如,你可以將所有使用者相關的功能放在users.py檔案中,所有銷售相關的功能放在ecommerce.py中,然後將他們匯入到site.py中。這裡我們不再舉例說明了,超出了這個例項程式討論的範圍。

5.2                     Pyramid

Pyramid的載入程式叫做pcreate,是Pyramid的組成部分。

[python]  view plain  copy
  1. $ pcreate-s starter hello_pyramid # Just make a Pyramid project  

Pyramid 通常被用來開發比Flask更大型的應用。因此,pcreate建立的專案有著更多的內容,包括基本的配置檔案、模板示例和需要將你的專案上傳到Python Package Index所需要的檔案。

[html]  view plain  copy
  1. hello_pyramid  
  2. ├── CHANGES.txt  
  3. ├── development.ini  
  4. ├── MANIFEST.in  
  5. ├── production.ini  
  6. ├── hello_pyramid  
  7. │   ├── __init__.py  
  8. │   ├── static  
  9. │   │   ├── pyramid-16x16.png  
  10. │   │   ├── pyramid.png  
  11. │   │   ├── theme.css  
  12. │   │   └── theme.min.css  
  13. │   ├── templates  
  14. │   │   └── mytemplate.pt  
  15. │   ├── tests.py  
  16. │   └── views.py  
  17. ├── README.txt  
  18. └── setup.py  

5.3                     Django

 

Django也有自帶的載入程式———django-admin。

[python]  view plain  copy
  1. django-admin startproject hello_django  
  2. django-admin startapp howdy # make an application within our project  

我們已經可以明顯地看出Django和Pyramid的不同之處了。Django將不同的專案劃分到不同的應用中去。而Flask和Pyramid會多個應用放到一個專案中去,通過不同的view來進行區分。當然,開發者手動地進行區分也是可行的,但是預設並不進行區分。

[html]  view plain  copy
  1. hello_django  
  2. ├── hello_django  
  3. │   ├── __init__.py  
  4. │   ├── settings.py  
  5. │   ├── urls.py  
  6. │   └── wsgi.py  
  7. ├── howdy  
  8. │   ├── admin.py  
  9. │   ├── __init__.py  
  10. │   ├── migrations  
  11. │   │   └── __init__.py  
  12. │   ├── models.py  
  13. │   ├── tests.py  
  14. │   └── views.py  
  15. └── manage.py  

Django預設只提供空的model和模板檔案,新使用者只能看到一些簡單的示例程式碼。

載入程式不引導使用者去打包他們的應用,這種做法有一個不足之處,是新手沒有這個意識去這樣做。如果一個開發者之前沒有打包過應用,那麼他會發現他第一次部署的時候會有多麼的困難。但基本上小型的專案都沒有統一打包。

 

6                         模板

 

有了基本的HTTP 伺服器還遠遠不夠,使用者肯定希望你還能有個風光靚麗的介面。

模板讓你能夠動態地更改頁面資訊,而不要呼叫AJAX。這個機制從使用者的角度來說非常的友好,因為你只需要取一次全頁面的資訊和其他動態的資料,對於一些移動裝置訪問網站來說,這樣的行為能為他們節省許多時間。

所有的模板都基於context,提供動態的資訊給模板並最終渲染到HTML中。讓我們來看一個例子,將使用者的登入名顯示給他們看。

6.1                     Django

我們的示例非常簡單,假設我們有一個user物件,其有一個fullname屬性,包含了user的名字。我們會這樣傳遞給模板:

[python]  view plain  copy
  1. def a_view(request):  
  2.     # get the logged in user  
  3.     # ... do more things  
  4.     return render_to_response(  
  5.         "view.html",  
  6.         {"user": cur_user}  
  7.     )  

接下來我們需要將user物件傳入到模板中去。可以在其中直接訪問其fullname屬性。

[html]  view plain  copy
  1. <!-- view.html -->  
  2. <div class="top-bar row">  
  3.   <div class="col-md-10">  
  4.   <!-- more top bar things go here -->  
  5.   </div>  
  6.   {% if user %}  
  7.   <div class="col-md-2 whoami">  
  8.     You are logged in as {{ user.fullname }}  
  9.   </div>  
  10.   {% endif %}  
  11. </div>  

首先,你會發現其中{%  if user %}這個結構。在Django中{%是用來放迴圈或條件控制等語句的。if user用來判斷是否有user傳入。匿名user是無法看到’You are logged in as xxx’的頁面的。

在if程式碼塊中,只需要簡單地把物件及其屬性放到{{  }}中去即可,模板就會自動去呼叫實際的值。

 

另一個模板的常見用法是顯示成組的資訊,比如商業網站的庫存資訊:

[html]  view plain  copy
  1. def browse_shop(request):  
  2.     # get items  
  3.     return render_to_response(  
  4.         "browse.html",  
  5.         {"inventory": all_items}  
  6.     )  

其中,我們仍然可以使用{%來迴圈遍歷倉庫中所有的專案並且填充到各自的頁面中,如:

[html]  view plain  copy
  1. {% for widget in inventory %}  
  2.     <li><a href="/widget/{{ widget.slug }}/">{{ widget.displayname }}</a></li>  
  3. {% endfor %}  

對於大部分的需求來說,Django的模板系統可以通過非常簡單的結構來滿足。

 

6.2                     Flask

 

Flask預設使用Django推薦的Jinja2模板語言,但是也可以配置成使用其他的語言。實際上Jinja2和Django的模板系統還是有一些不同之處的,Jinja2更加易讀。

Jinja2和Django的模板系統偶讀提供了filtering功能。一個list在被顯示之前可以被一個指定的函式進行處理。例如:

[html]  view plain  copy
  1. <!-- Django -->  
  2. <div class="categories">Categories: {{ post.categories|join:", " }}</div>  
  3.   
  4. <!-- now in Jinja -->  
  5. <div class="categories">Categories: {{ post.categories|join(", ") }}</div

    相關推薦

    Django Flask Pyramid框架對比

    1                         

    Django FlaskTornado的對比

    #1.Django走的是大而全的方向,開發效率高。它的MTV框架,自帶的ORM,admin後臺管理,自帶的sqlite資料庫和開發測試用的伺服器 #給開發者提高了超高的開發效率 #2.Flask是輕量級的框架,自由,靈活,可擴充套件性很強,核心基於Werkzeug WSGI工具和jinja2模板引擎

    Python web後端開發框架 Django FlaskTornado

    httpserver : 非阻塞 HTTP serverhttpclient : 非同步 HTTP client 用來和web 及 httpserver 協同工作auth :第三方認證的實現locale:針對本地化和翻譯的支援等等

    web框架本質--學Djangoflasktornado框架前必讀

    Web框架本質 眾所周知,對於所有的Web應用,本質上其實就是一個socket服務端,使用者的瀏覽器其實就是一個socket客戶端。 上述通過socket來實現了其本質,而對於真實開發中的python web程式來說,一般會分為兩部分:伺服器程式和應用程式。伺服器程式

    DjangoFlaskTornado的區別?

      Django:Python 界最全能的 web 開發框架,battery-include 各種功能完備,可維護性和開發速度一級棒。常有人說 Django 慢,其實主要慢在 Django ORM 與資料庫的互動上,所以是否選用 Django,取決於專案對資料庫互動的要求以及各種優化。而對於 Dj

    《Python高效開發實戰:DjangoTornadoFlaskTwisted》pdf下載

    也許你聽說過全棧工程師,他們善於設計系統架構,精通資料庫建模、通用網路協議、後端併發處理、前端介面設計,在學術研究或工程專案上能獨當一面。通過對Python及其周邊Web框架的學習和實踐,你就可以成為這樣的全能型人才。 本書分為3部分:第1部分是基礎篇,帶領初學者實踐Python開發環境和

    阿裏雲服務器部署筆記一(python3FlaskuWSGINginx)

    size 環境 ima 就是 註意 退出 sgi nginx 阿裏雲服務器 一、重置密碼,並重啟服務器 二、安全組配置>配置規則>添加安全組規則(為了能在本地ssh到實例) 配置如下: 此配置為允許任意公網IP登陸實例,註意windows與Linux系統端口範

    jupyterflasktornadodjiango安裝

    安裝django tor nbsp span ado 直接 pan djang jupyter 安裝了pip包的話直接使用:     1、安裝jupyter:pip install jupyter     2、安裝flask: pip install flask  

    轉載:Python Web 框架DjangoFlask 與 Tornado 的效能對比

    原文地址: https://www.jianshu.com/p/9960a9667a5c 寫在前面: 本文的資料涉及到我面試時遇到過的問題,大概一次 http 請求到收到響應需要多少時間。這個問題在實際工作中與框架有比較大的關係,因此特別就框架的效能做了一次分析。

    正宗Djiango框架(Bootstrap Django母版Cookie)

    rom html 配置 signed -- obj https tick 發送 一. Bootstrap 一個包含CSS和JS的一個代碼庫   -- 樣式   -- 響應式 @media關鍵字     --導航條 @media(nin-width:768px){

    FlaskDjango模板網頁顯示python字符串的換行

    模板換行 {{safe}}這個問題so,easy,把python的字符串換行,更換成html的換行不就ok了,如下:result=result.repalce(‘\n‘,‘<br/>‘)But,result並不盡人意還是沒有效果(如果這樣就可以了,就不會看到這個文章了吧),<br/>

    29Python之Web框架Django入門

    char rip 目的 temp 安裝完成 ron 們的 執行命令 一個 一、Django入門   1、django的安裝。django的安裝和安裝其他模塊一樣,我們找到python的安裝目錄的script目錄,然後執行命令:pip3 install Django即可。安裝

    五十八Django框架中配置使用mysql

    mysql命令的回顧: 注意:django框架不會自動生成mysql資料庫,所以需要手動去建立。 1、開啟wamp軟體,開始建立mysql資料庫: 2、進入虛擬環境建立django專案: 3、進入專案建立應用 4、註冊剛剛建立的應用:

    三十二python學習之Flask框架(四)模板:jinja2模板過濾器模板複用(繼承巨集包含)瞭解CSRF跨站請求攻擊

    一、jinja2模板引擎的簡介: 1.模板: 1.1檢視函式的兩個作用: 處理業務邏輯; 返回響應內容; 1.3 什麼是模板: 模板其實是一個包含響應文字的檔案,不是特指的html檔案,其中用佔位符(變數)表示動態部分,告訴模板引擎其具體的

    三十一python學習之Flask框架(三)檢視:路由上下文Flask-Script擴充套件

    一、裝飾器路由的具體實現 1.Flask框架路由實現 Flask有兩大核心:Werkzeug和Jinja2 Werkzeug實現路由、除錯和Web伺服器閘道器介面 Jinja2實現了模板。 Werkzeug是一個遵循WSGI協議的python函式庫

    Django框架(十二)—— 補充:inclusion_tagdeferonlychoice事務建立多對多的第三張表

    補充:inclusion_tag、defer、only、choice、事務、建立多對多的第三張表 一、inclusion_tag 1、作用 用於生成HTML片段,是資料由引數傳入而變成動態 2、使用 # 1.app下新建一個模組,templatetags # 2.建立一個py檔案(mytag.py)

    Django框架(十九)—— auth框架:使用者登入註冊認證

    auth模組 一、什麼是author模組 Auth模組是Django自帶的使用者認證模組,可以實現包括使用者註冊、使用者登入、使用者認證、登出、修改密碼等功能。預設使用 auth_user 表來儲存使用者資料。 二、auth模組的使用 1、建立超級使用者(create_superuser()) 建立

    關於DjangoFlask架的一些面試知識點

    Django 1.django、flask、tornado框架的比較? Django: 對於django,大而全的框架它的內部元件比較多,內部提供:ORM、Admin、中 間件、Form、ModelForm、Session、快取、訊號、CSRF;功能也都挺完善的 Fla

    20180926:關於Flaskflask_sqlalchemy flask_wtf 這幾個框架分別是幹什麼的?

    學習視訊後,一個模組接一個模組的,很難分清,現自己總結一下(不一定完全準確): flask: 這個是網頁框架,主要可以在程式設計中實現網頁顯示,和網頁互動等功能,實現Web程式開發。 app = Flask(__name__) # 例項化一個Flask fl

    vuereactangular三大框架對比

    首先,我們先了解什麼是MVX框架模式? MVX框架模式:MVC+MVP+MVVM 1.MVC:Model(模型)+View(檢視)+controller(控制器),主要是基於分層的目的,讓彼此的職責分開。 View通過Controller來和Model聯絡,C