博客地址:https://ask.hellobi.com/blog/zhiji 歡迎你們來交流學習。html
在Python web 開發框架裏有多種選擇,有**Django、Tornado、Flask、web2py、Pylons、Pyramid等等,以前寫過Django、Tornado,今天咱們主要學習Pyramid**,仍是從官方文檔學起。python
#1.Pyramid Pyramid 是 Pylons 項目下面一系列已經發行的軟件中的一員。**Pylons 官網**描述了 Pyramid 和 Pylons Project 的關係。web
Pyramid以其高效率和快節奏的開發能力而出名。官方文檔是這樣描述的:Pyramid is a small, fast, down-to-earth Python web framework. It is developed as part of the Pylons Project. It is licensed under a BSD-like license. 此開源Web框架有一個獨立於平臺的MVC結構,提供了開發的最簡途徑。此外,它仍是高效開發重用代碼的首選平臺之一。數據庫
##Pyramid 和其餘 web 框架(由Pyramid英文文檔翻譯) 第一個 Pyramid 版本的前生(叫作 repoze.bfg )建立於 2008 年。2010 年底,咱們把 repoze.bfg 更名爲 Pyramid 並於同年11月份合併到 Pylons 項目中。瀏覽器
Pyramid 的靈感來源於 Zope、Pylons 1.0 和 Django ,最終,Pyramid 向它們各自借鑑一些概念和特性並組成一個獨特的框架。bash
Pyramid 的許多特性都要追溯到 Zope 。像 Zope 應用程序同樣,Pyramid 應用程序是易於擴展的:若是你遵照必定的規則,那麼你的應用程序將會被重用、改進、重構,甚至被第三方開發者擴展而不用 fork 原始程序。 Traversal 和 declarative security 等概念都是在 Zope 中首先被提出來的。服務器
Pyramid 的 URL dispatch 概念受 Pylons 1.0 版本的 Routes 系統啓發的,Pyramid 像 Pylons 1.0 版本同樣採用自由政策。它沒有指定你應該使用哪一個數據庫,它的內置模板只是爲了方便。實際上,它僅僅提供一種將 URL 映射到 view 代碼上的機制,以及調用那些 views 的規則。你能夠無償使用第三方組件來知足你項目的需求。app
Pyramid 常用的 view 這一律念來自 Django 。Pyramid 的文檔風格比起 Zope 更像 Django 。框架
相似 Pylons 1.0 版本,卻不像 Zope ,一個 Pyramid 應用程序開發者可使用一個完整的語句命令去執行一個框架經常使用的配置任務好比增長一個 view 或者一個 route 。在 Zope 裏面 ZCML 也有相似功能。Pyramid 支持隨時可用的命令語句配置和基於修飾符的配置;ZCML 經過一個擴展包 pyramd_zcml 使用。函數
既不像 Zope ,也不像 「full-stack」 這樣的框架好比 Django ,Pyramid 對於你使用哪種持續化的機制構建應用程序不作任何假設。Zope 應用程序依賴於 ZODB;Pyramid 也容許你建立 ZODB 程序但卻不依賴 ZODB 自己。一樣,Django 傾向於假定你想要把你的應用程序數據存儲在一個關係型數據庫中。Pyramid 從不作這些假設,它容許你使用關係型數據庫可是不鼓勵也不阻止的決定。
其餘的 Python web framework 都宣稱他們本身是一個類成員 web framework 叫作model-view-controller 框架,Pyramid 也屬於這一類。
##框架 VS 庫 (由Pyramid英文文檔翻譯)
一個 框架 和一個 庫 最大的區別在於:庫裏面的代碼被你寫的代碼 調用 ,而框架則是 調用 你寫的代碼。使用一系列的庫來建立應用程序一般在剛開始的時候要比使用框架簡單,由於你能夠有選擇性地放棄一些控制權給不是你寫的庫代碼。可是當你使用一個框架的時候,你必須放棄絕大部分的控制權交給那些不是你寫的代碼:整個框架。你不是必須使用一個框架來建立一個 WEB 應用程序在使用 Python 的狀況下。一大批豐富的庫都被已經被開發出來。然而在實際應用中,使用框架去建立應用要比使用一系列的庫更加實用,若是這個框架提供的一些列功能都符合你的項目要求。
#2.Pyramid的安裝 官網講的仍是蠻清楚的,照着來就行。
python ez_setup.py
複製代碼
easy_install virtualenv
複製代碼
virtualenv --no-site-packages env
複製代碼
easy_install pyramid
複製代碼
#3.Pyramid使用
###1.建立第一個pyramid應用程序
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
def hello_world(request):
return Response('Hello %(name)s!'%request.matchdict)
if __name__ == '__main__':
#建立了一個Configuration類的實例config
config = Configurator()
#註冊了一個以/hello/開頭的URL路由,路由的名字就叫'hello'
config.add_route('hello','/hello/{name}')
#註冊了一個view callable函數 URL Path(好比/hello/world)->route(好比'hello')->view callable(好比hello_world函數)
config.add_view(hello_world,route_name='hello')
#pyramid.config.Configurator.make_wsgi_app()方法來建立WSGI應用程序
app = config.make_wsgi_app()
#啓動了一個WSGI服務
server = make_server('0.0.0.0',8080,app)
#serve_forever()方法建立了一個循環來接受外界的request請求
server.serve_forever()
複製代碼
打開你的瀏覽器,輸運行運行入http://localhost:8080/hello/world,將會顯示「Hello world!」。 如今咱們對這個示例程序有了一個基本的認識,接下來一步一步分析它是如何工做的。
Imports 包 第2行引入了pyramid.config模塊的Configurator類,第10行建立了它的一個實例,而後經過這個實例來配置咱們的應用。 跟其餘Python web框架同樣,Pyramid 用 WSGI 協議來將一個應用程序和web服務器聯繫到一塊兒。而第一行用到的wsgiref模塊就是WSGI服務的一種封裝,如今wsgiref已經被引入Python 標準庫了。 第三行引入了pyramid.response.Response,用來返回response信息。
View Callable 聲明 第六行定義了一個hello_world函數,傳入request參數,返回pyramid.response.Response類的一個實例。經過調用request對象的matchdict方法來輸入匹配到的name路徑。因爲咱們訪問的是http://localhost:8080/hello/world,因此匹配到的是world並以「hello world」的字符串返回,若是你訪問的是http://localhost:8080/hello/pyramid,那麼返回的將是「hello pyramid!」。 這個函數被稱爲 view callable(你能夠叫它視圖調用,但我仍是以爲用英文的比較好)。 一個視圖調用 接受一個參數:request 。 它將返回一個response 對象。 一個view callable不必定是一個函數,也能夠是一個類或一個實例, 可是這裏爲了簡單起見,咱們用了函數。 一個view callable老是伴隨着調用 request對象。 一個request對象就表明着一個經過被激活的WSGI服務器傳送到pyramid的HTTP請求。 一個view callable還須要返回一個response對象。由於一個response對象擁有全部來制定一個實際的HTTP 響應所必要的信息。這個對象經過 wsgi 服務器,也就是Pyramid,轉化爲文本信息發送回請求的瀏覽器。爲了返回一個response,每一個view callable建立的一個response實例。在 hello_world函數中, 一個字符串做爲response的body來返回。
Application Configuration 應用程序配置 第10-15行是應用程序的配置信息。 第10行建立了一個Configuration類的實例config,經過這個實例來對咱們的Pyramid應用進行配置,包括路由,ip,端口等信息。調用config的各類方法設置應用程序註冊表(application registry),對咱們的應用程序進行註冊。什麼是application registry?下面是官方解釋:
第11行調用pyramid.config.Configurator.add_route()方法,註冊了一個以/hello/開頭的URL路由,路由的名字就叫'hello'。 第12行config.add_v運行iew(hello_world, route_name='hello'),註冊了一個view callable函數(也就是hello_world函數),當名爲'hello'的路由被匹配時應該調用這個函數。 這三者的對應關係也就是URL Path(好比/hello/world)->route(好比'hello')->view callable(好比hello_world函數)。這樣,一個前臺頁面就和一個後臺處理方法對應起來了。 WSGI Application Creation 建立WSGI應用程序 當全部的配置工做完成後,python腳本經過pyramid.config.Configurator.make_wsgi_app()方法來建立WSGI應用程序。這個方法返回一個WSGI應用程序對象並傳遞給app引用,讓WSGI服務器來使用。WSGI是一個讓服務器能和python應用程序交流的協議。這裏不打算深刻探討WSGI,若是你有興趣,能夠去官網wsgi.org瞭解更多。 WSGI Application Serving 最後兩行,咱們啓動了一個WSGI服務。make_server('0.0.0.0',8080,app)方法綁定了ip和端口,最後一個參數傳遞咱們的app對象(一個router),也就是咱們想服務的那個應用程序。serve_forever()方法建立了一個循環來接受外界的request請求。#4.Pyramid部分語法
locals()用法:locals()能夠直接將函數中全部的變量所有傳給模板。固然這可能會傳遞一些多餘的參數,有點浪費內存的嫌疑。
render()方法是render_to_response的一個嶄新的快捷方式,前者會自動使用RequestContext。然後者必須coding出來,這是最明顯的區別,固然前者更簡潔。
return render_to_response('blog_add.html',{'blog': blog,
'form': form, 'id': id, 'tag': tag},
context_instance=RequestContext(request))
return render(request, 'blog_add.html',
{'blog': blog, 'form': form, 'id': id, 'tag': tag})
複製代碼