日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
PythonWeb框架:DjangovsFlaskvsPyramid

Pyramid, Django, 和 Flask都是優(yōu)秀的框架,為項目選擇其中的哪一個都是傷腦筋的事。我們將會用三種框架實現(xiàn)相同功能的應(yīng)用來更容易的對比三者。也可以直接跳到框架實戰(zhàn)(Frameworks in Action)章節(jié)查看代碼(code)。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、三門峽網(wǎng)站維護、網(wǎng)站推廣。

1. 簡介

世界上可選的基于Python的web框架有很多。Django, Flask, Pyramid, Tornado, Bottle, Diesel, Pecan, Falcon等等,都在爭取開發(fā)者支持。作為一開發(fā)者從一堆選擇中篩選出一個來完成項目將會成為下一個大工程。我們今天專注于Flask, Pyramid, 和 Django。它們涵蓋了從小微項目到企業(yè)級的web服務(wù)。

為了更容易在三者中作出選擇(至少更了解它們),我們將用每一個框架構(gòu)建同樣的應(yīng)用并比較它們的代碼,對于每一個方法我們會高亮顯示它的優(yōu)點和缺點。如果你只想要代碼,直接跳到框架實戰(zhàn)章節(jié)(Frameworks in Action),或者查看其在Github上的代碼。

Flask是一個面向簡單需求小型應(yīng)用的“微框架(microframework)”。Pyramid和Django都是面向大型應(yīng)用的,但是有不同的拓展性和靈活性。Pyramid的目的是更靈活,能夠讓開發(fā)者為項目選擇合適的工具。這意味著開發(fā)者能夠選擇數(shù)據(jù)庫、URL結(jié)構(gòu)、模板類型等等。Django目的是囊括web應(yīng)用的所有內(nèi)容,所以開發(fā)者只需要打開箱子開始工作,將Django的模塊拉進箱子中。

Django包括一個開箱即用的 ORM ,而Pyramid和 Flask讓開發(fā)者自己選擇如何或者是否存儲他們的數(shù)據(jù)。到目前為止對于非Django的web應(yīng)用來說***的ORM是SQLAlchemy,同時還有多種其他選擇,從 DynamoDB和MongoDB 到簡單本地存儲的LevelDB 或樸實的SQLite。Pyramid被設(shè)計為可使用任何數(shù)據(jù)持久層,甚至是還沒有開發(fā)出來的。

2.關(guān)于框架

Django的”batteries included” 特性讓開發(fā)者不需要提前為他們的應(yīng)用程序基礎(chǔ)設(shè)施做決定,因為他們知道Python已經(jīng)深入到了web應(yīng)用當中。Django已經(jīng)內(nèi)建了模板、表單、路由、認證、基本數(shù)據(jù)庫管理等等。比較起來,Pyramid包括路由和認證,但是模板和數(shù)據(jù)庫管理需要額外的庫。

前面為 Flask和Pyramid apps選擇組件的額外工作給那些使用案例不適用標準ORM的開發(fā)者提供了更多的靈活性,同樣也給使用不同工作流和模版化系統(tǒng)的開發(fā)者們帶來了靈活性。

Flask,作為三個框架里面最稚氣的一個,開始于2010年年中。Pyramid框架是從Pylons項目開始的,在2010年底獲得 Pyramid這個名字,雖然在2005年就已經(jīng)發(fā)布了***個版本。Django 2006年發(fā)布了***個版本,就在Pylons項目(***叫Pyramid)開始之后。Pyramid和Django都是非常成熟的框架,積累了眾多插件和擴展以滿足難以置信的巨大需求。

雖然Flask歷史相對更短,但它能夠?qū)W習之前出現(xiàn)的框架并且把注意力放在了微小項目上。它大多數(shù)情況被使用在一些只有一兩個功能的小型項目上。例如 httpbin,一個簡單的(但很強大的)調(diào)試和測試HTTP庫的項目。

3. 社區(qū)

***活力的社區(qū)當屬Django,其有80,000個StackOverflow問題和一系列來自開發(fā)者和優(yōu)秀用戶的良好的博客。Flask和Pyramid社區(qū)并沒有那么大,但它們的社區(qū)在郵件列表和IRC上相當活躍。StackOverflow上僅有5,000個相關(guān)的標簽,F(xiàn)lask比Django小了15倍。在Github上,它們的star近乎相當,Django有11,300個,F(xiàn)lask有10,900個。

三個框架都使用的是BSD衍生的協(xié)議。Flask和Django的協(xié)議是BSD 3條款,Pyramid的Repoze Public License RPL是BSD協(xié)議 4條款的衍生。

4. Bootstrapping

Django和Pyramid都內(nèi)建bootstrapping工具。Flask沒有包含類似的工具,因為Flask的目標用戶不是那種試圖構(gòu)建大型MVC應(yīng)用的人。

4.1 Flask

Flask的hello world應(yīng)用非常的簡單,僅僅單個Python文件的7行代碼就夠了。

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

這是Flask沒有bootstrapping工具的原因:沒有它們的需求。從Flask主頁上的Hello World特性看,沒有構(gòu)建Python web應(yīng)用經(jīng)驗的開發(fā)者可以立即開始hacking。

對于各部分需要更多分離的項目,F(xiàn)lask有blueprints。例如,你可以將所有用戶相關(guān)的函數(shù)放在users.py中,將銷售相關(guān)的函數(shù)放在ecommerce.py中,然后在site.py中添加引用它們來結(jié)構(gòu)化你的Flask應(yīng)用。我們不會深入這個功能,因為它超出了我們展示demo應(yīng)用的需求。

4.2 Pyramid

Pyramid 的 bootstrapping工具叫 pcreate,是Pyramid的組成部分. 之前的 Paste 工具套裝提供了 bootstrapping ,但是從那之后被 Pyramid專用工具鏈替代了。

 
 
 
 
  1. $ pcreate -s starter hello_pyramid # Just make a Pyramid project 

Pyramid 比 Flask 適用于更大更復(fù)雜的應(yīng)用程序. 因為這一點,它的 bootstrapping工具創(chuàng)建更大的項目骨架. Pyramid 同樣加入了基本的配置文件,一個例子模版和用于將程序打包上傳到 Python Package Index的所有文件。

 
 
 
 
  1. hello_pyramid 
  2.  
  3. ├── CHANGES.txt 
  4.  
  5. ├── development.ini 
  6.  
  7. ├── MANIFEST.in 
  8.  
  9. ├── production.ini 
  10.  
  11. ├── hello_pyramid 
  12.  
  13. │   ├── __init__.py 
  14.  
  15. │   ├── static 
  16.  
  17. │   │   ├── pyramid-16x16.png 
  18.  
  19. │   │   ├── pyramid.png 
  20.  
  21. │   │   ├── theme.css 
  22.  
  23. │   │   └── theme.min.css 
  24.  
  25. │   ├── templates 
  26.  
  27. │   │   └── mytemplate.pt 
  28.  
  29. │   ├── tests.py 
  30.  
  31. │   └── views.py 
  32.  
  33. ├── README.txt 
  34.  
  35. └── setup.py  

作為***描述的框架,Pyramid的bootstrapper非常靈活. 不局限于一個默認的程序;pcreate 可以使用任意數(shù)量的項目模版. 包括我們上面用到的pcreate里面的”starter”的模版, 還有 SQLAlchemy- ,ZODB-支持scaffold項目. 在 PyPi可以發(fā)現(xiàn)已經(jīng)為Google App Engine, jQuery Mobile, Jinja2 templating, modern frontend frameworks做好的scaffolds, 還有更多~

4.3 Django

Django 也有自己的 bootstrap 工具, 內(nèi)置在 django-admin 中.

 
 
 
 
  1. django-admin startproject hello_django 
  2.  
  3. django-admin startapp howdy # make an application within our project  

Django 跟 Pyramid 區(qū)別在于: Django 由多個應(yīng)用程序組成一個項目, 而 Pyramid 以及 Flask 項目是包含 View 和 Model 單一應(yīng)用程序 . 理論上, Flask 和 Pyramid 的項目允許存在多個 project/app, 不過在默認配置中只能有一個.

 
 
 
 
  1. hello_django 
  2.  
  3. ├── hello_django 
  4.  
  5. │   ├── __init__.py 
  6.  
  7. │   ├── settings.py 
  8.  
  9. │   ├── urls.py 
  10.  
  11. │   └── wsgi.py 
  12.  
  13. ├── howdy 
  14.  
  15. │   ├── admin.py 
  16.  
  17. │   ├── __init__.py 
  18.  
  19. │   ├── migrations 
  20.  
  21. │   │   └── __init__.py 
  22.  
  23. │   ├── models.py 
  24.  
  25. │   ├── tests.py 
  26.  
  27. │   └── views.py 
  28.  
  29. └── manage.py  

Django 默認只在項目中創(chuàng)建 空白的 model 和模板文件, 供新手參考的示范代碼不多. 此外, 開發(fā)者在發(fā)布應(yīng)用程序的時候, 還要自己配置, 這也是個麻煩.

bootstrap 工具的缺點是沒有指導(dǎo)開發(fā)者如何打包應(yīng)用. 對于那些沒有經(jīng)驗的新手來說, ***次部署應(yīng)用將是個很頭疼的問題. 像 django-oscar 這樣的大社區(qū), 項目都是打包好了, 放在 PyPi 上供大家安裝. 但是 Github 上面的小項目缺少統(tǒng)一的打包方式.

5. 模板

一個Python應(yīng)用能夠響應(yīng)HTTP請求將是一個偉大的開端,但是有可能你的大多數(shù)用戶是沒有興趣使用curl與你的web應(yīng)用交互的。幸運的是,這三個競爭者提供了使用自定義信息填充HTML的方法,以便讓大伙們能夠享受時髦的Bootstrap 前端。

模板讓你能夠直接向頁面注入動態(tài)信息,而不是采用AJAX。你只需要一次請求就可以獲取整個頁面以及所有的動態(tài)數(shù)據(jù),這對用戶體驗來說是很好的。這對于手機網(wǎng)站來說尤其重要,因為一次請求花費的時間會更長。

所有的模板選項依賴于“上下文環(huán)境(context)”,其為模板轉(zhuǎn)換為HTML提供了動態(tài)信息。模板的最簡單的例子是填充已登錄用戶的名字以正確的迎接他們。也可以用AJAX獲取這種動態(tài)信息,但是用一整個調(diào)用來填寫用戶的名字有點過頭了,而同時模板又是這么的簡單。

5.1 Django

我們使用的例子正如寫的那么簡單,假設(shè)我們有一個包含了用戶名的funllname屬性的user對象。在Python中我們這樣向模板中傳遞當前用戶:

 
 
 
 
  1. def a_view(request): 
  2.  
  3.     # get the logged in user 
  4.  
  5.     # ... do more things 
  6.  
  7.     return render_to_response( 
  8.  
  9.         "view.html", 
  10.  
  11.         {"user": cur_user} 
  12.  
  13.     )  

擁有這個模板的上下文很簡單,傳入一個Python對象的字典和模板使用的數(shù)據(jù)結(jié)構(gòu)?,F(xiàn)在我們需要在頁面上渲染他們的名字,以防頁面忘了他們是誰。

 
 
 
 
  1.  
  2.  
  3.  
  4.  
  5.    
  6.  
  7.    
  8.  
  9.   
 
  •  
  •   {% if user %} 
  •  
  •    
  •  
  •     You are logged in as {{ user.fullname }} 
  •  
  •   
  •  
  •  
  •   {% endif %} 
  •  
  •   

    首先,你會注意到這個 {% if user %} 概念。在Django模板中, {% 用來控制循環(huán)和條件的聲明。這里的if user聲明是為了防止那些不是用戶的情況。匿名用戶不應(yīng)該在頁面頭部看到“你已經(jīng)登錄”的字樣。

    在if塊內(nèi),你可以看到,包含名字非常的簡單,只要用{{}}包含著我們要插入的屬性就可以了。{{是用來向模板插入真實值的,如{{ user.fullname }}。

    模板的另一個常用情況是展示一組物品,如一個電子商務(wù)網(wǎng)站的存貨清單頁面。

     
     
     
     
    1. def browse_shop(request): 
    2.  
    3.     # get items 
    4.  
    5.     return render_to_response( 
    6.  
    7.         "browse.html", 
    8.  
    9.         {"inventory": all_items} 
    10.  
    11.     )  

    在模板中,我們使用同樣的{%來循環(huán)清單中的所有條目,并填入它們各自的頁面地址。

     
     
     
     
    1. {% for widget in inventory %} 
    2.  
    3. {{ widget.displayname }}
    4.  
    5.  
    6. {% endfor %}  

    為了做大部分常見的模板任務(wù),Django可以僅僅使用很少的結(jié)構(gòu)來完成目標,因此很容易上手。

    5.2 Flask

    Flask默認使用受Django啟發(fā)的Jinja2模板語言,但也可以配置來使用另一門語言。不應(yīng)該抱怨一個倉促的程序員分不清Django和Jinja模板。事實是,上面的Django例子在Jinja2也有效。為了不去重復(fù)相同的例子,我們來看下Jinja2比Django模板更具表現(xiàn)力的地方。

    Jinja和Django模板都提夠了過濾的特性,即傳入的列表會在展示前通過一個函數(shù)。一個擁有博文類別屬性的博客,可以利用過濾特性,在一個用逗號分割的列表中展示博文的類別。

     
     
     
     
    1.  
    2.  
    3. Categories: {{ post.categories|join:", " }}
       
  •  
  •  
  •  
  • Categories: {{ post.categories|join(", ") }}
  •   

    在Jinja模板語言中,可以向過濾器傳入任意數(shù)量的參數(shù),因為Jinja把它看成是 使用括號包含參數(shù)的Python函數(shù)的一個調(diào)用。Django使用冒號來分割過濾器的名字和過濾參數(shù),這限制了參數(shù)的數(shù)目只能為一。

    Jinjia和Django的for循環(huán)有點類似。我們來看看他們的不同。在Jinjia2中,for-else-endfor結(jié)構(gòu)能遍歷一個列表,同時也處理了沒有項的情況。

     
     
     
     
    1. {% for item in inventory %} 
    2.  
    3. {{ item.render() }}
     
  •  
  • {% else %} 
  •  
  •  
  •  
  • No items found

     
  •  
  • Try another search, maybe?

     
  •  
  •  
  •  
  • {% endfor %}  
  • Django版的這個功能是一樣的,但是是用for-empty-endfor而不是for-else-endfor。

     
     
     
     
    1. {% for item in inventory %} 
    2.  
    3. {{ item.render }}
     
  •  
  • {% empty %} 
  •  
  •  
  •  
  • No items found

     
  •  
  • Try another search, maybe?

     
  •  
  •  
  •  
  • {% endfor %}  
  • 除了語法上的不同,Jinja2通過執(zhí)行環(huán)境和高級特性提供了更多的控制。例如,它可以關(guān)閉危險的特性以安全的執(zhí)行不受信任的模板,或者提前編譯模板以確保它們的合法性。

    5.3 Pyramid

    與Flask類似,Pyramid支持多種模板語言(包括Jinja2和Mako),但是默認只附帶一個。Pyramid使用Chameleon,一個 ZPT (Zope Page Template) 模板語言的實現(xiàn)。我們來回頭看看***個例子,添加用戶的名字到網(wǎng)站的頂欄。Python代碼除了明確調(diào)用了render_template函數(shù)外其他看起來都差不多。

     
     
     
     
    1. @view_config(renderer='templates/home.pt') 
    2.  
    3. def my_view(request): 
    4.  
    5.     # do stuff... 
    6.  
    7.     return {'user': user}  

    但是我們的模板看起來有些不同。ZPT是一個基于XML得模板標準,所以我們使用了類XSLT語句來操作數(shù)據(jù)。

     
     
     
     
    1.  
    2.  
    3.    
    4.  
    5.    
    6.  
    7.   
     
  •  
  •   
  •  
  •        tal:content="string:You are logged in as ${user.fullname}" 
  •  
  •        class="col-md-2 whoami"> 
  •  
  •   
  •  
  •  
  •   

    Chameleon對于模板操作有三種不同的命名空間。TAL(模板屬性語言)提供了基本的條件語句,字符串的格式化,以及填充標簽內(nèi)容。上面的例子只用了TAL來完成相關(guān)工作。對于更多高級任務(wù),就需要TALES和METAL。TALES( 模板屬性表達式語法的語言)提供了像高級字符串格式化,Python表達式評估,以及導(dǎo)入表達式和模板的表達式。

    METAL(宏擴展模板屬性語言)是Chameleon模板***大的(和復(fù)雜的)一部分。宏是可擴展的,并能被定義為帶有槽且當宏被調(diào)用時可以被填充。

    6. 利用框架行動起來

    對于各個框架,我們將通過制作一個叫做wut4lunch的應(yīng)用來了解,這個應(yīng)用是告訴整個互聯(lián)網(wǎng)你午飯吃了什么的社交網(wǎng)絡(luò)。很自由的一個起始想法,完全可以隨意改變。應(yīng)用將有一個簡單的接口,允許用戶提交他們午飯的內(nèi)容,并看到其他用戶吃的什么的列表。主頁完成后將看起來像這樣。

    6.1 使用Flask的Demo應(yīng)用

    最短的實現(xiàn)用了34行Python代碼和一個22行的Jinja模板。首先,我們有些管理類的任務(wù)要做,比如初始化我們的應(yīng)用并拉近我們的ORM。

     
     
     
     
    1. from flask import Flask  
    2.   
    3.  
    4. # For this example we'll use SQLAlchemy, a popular ORM that supports a 
    5.  
    6. # variety of backends including SQLite, MySQL, and PostgreSQL 
    7.  
    8. from flask.ext.sqlalchemy import SQLAlchemy    
    9.  
    10. app = Flask(__name__) 
    11.  
    12. # We'll just use SQLite here so we don't need an external database 
    13.  
    14. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'   
    15.  
    16. db = SQLAlchemy(app)  

    現(xiàn)在我們看下我們的模型,這將和另兩個樣例基本一樣。

     
     
     
     
    1. class Lunch(db.Model): 
    2.  
    3.     """A single lunch""" 
    4.  
    5.     id = db.Column(db.Integer, primary_key=True) 
    6.  
    7.     submitter = db.Column(db.String(63)) 
    8.  
    9.     food = db.Column(db.String(255))  

    哇,相當簡單。最難的部分是找到合適的 SQLAlchemy數(shù)據(jù)類型,選擇數(shù)據(jù)庫中String域的長度。使用我們的模型也超級簡單,這在于我們將要看到 SQLAlchemy查詢語法。

    構(gòu)建我們的提交表單也很簡單。在引入Flask-WTForms和正確的域類型后,你可以看到表單看起來有點像我們的模型。主要的區(qū)別在于新的提交按鈕和食物與提交者姓名域的提示。

    應(yīng)用中的SECRET_KEY域是被WTForms用來創(chuàng)建CSRF符號的。它也被itsdangerous(Flask內(nèi)包含)用來設(shè)置cookies和其他數(shù)據(jù)。

     
     
     
     
    1. from flask.ext.wtf import Form 
    2.  
    3. from wtforms.fields import StringField, SubmitField      
    4.  
    5. app.config['SECRET_KEY'] = 'please, tell nobody'      
    6.  
    7. class LunchForm(Form): 
    8.  
    9.     submitter = StringField(u'Hi, my name is') 
    10.  
    11.     food = StringField(u'and I ate') 
    12.  
    13.     # submit button will read "share my lunch!" 
    14.  
    15.     submit = SubmitField(u'share my lunch!')  

    讓表單在瀏覽器中顯示意味著模板要有它。我們像下面那樣傳遞進去。

     
     
     
     
    1. from flask import render_template   
    2.  
    3. @app.route("/") 
    4.  
    5. def root(): 
    6.  
    7.     lunches = Lunch.query.all() 
    8.  
    9.     form = LunchForm() 
    10.  
    11.     return render_template('index.html', form=form, lunches=lunches)  

    好了,發(fā)生了什么?我們得到已經(jīng)用Lunch.query.all()提交的午餐列表,并實例化一個表單,讓用戶提交他們自己的美食之旅。為了簡化,變量使用相同的名字出入模板,但這不是必須的。

     
     
     
     
    1.  
    2.  
    3. Wut 4 Lunch 
    4.  
    5. What are people eating? 
    6.  
    7. Wut4Lunch is the latest social network where you can tell all your friends 

    8.  
    9. about your noontime repast!

        

    這就是模板的真實情況,我們在已經(jīng)吃過的午餐中循環(huán),并在