部落格地址:https://ask.hellobi.com/blog/zhiji 歡迎大家來交流學習。
在Python web 開發框架裡有多種選擇,有**Django、Tornado、Flask、web2py、Pylons、Pyramid等等,之前寫過Django、Tornado,今天我們主要學習Pyramid**,還是從官方文件學起。
#1.Pyramid Pyramid 是 Pylons 專案下面一系列已經發行的軟體中的一員。**Pylons 官網**描述了 Pyramid 和 Pylons Project 的關係。
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 向它們各自借鑑一些概念和特性並組成一個獨特的框架。
Pyramid 的許多特性都要追溯到 Zope 。像 Zope 應用程式一樣,Pyramid 應用程式是易於擴充套件的:如果你遵守一定的規則,那麼你的應用程式將會被重用、改進、重構,甚至被第三方開發者擴充套件而不用 fork 原始程式。 Traversal 和 declarative security 等概念都是在 Zope 中首先被提出來的。
Pyramid 的 URL dispatch 概念受 Pylons 1.0 版本的 Routes 系統啟發的,Pyramid 像 Pylons 1.0 版本一樣採用自由政策。它沒有指定你應該使用哪個資料庫,它的內建模板只是為了方便。實際上,它僅僅提供一種將 URL 對映到 view 程式碼上的機制,以及呼叫那些 views 的規則。你可以免費使用第三方元件來滿足你專案的需求。
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的安裝 官網講的還是蠻清楚的,照著來就行。
- 安裝setuptools 下載**ez_setup.py**(進入該頁面後網頁另存為ez_setup.py即可,記住存在D;\python目錄下)。cmd進入D:\python目錄,執行
python ez_setup.py
複製程式碼
- 安裝virtualenv 用python目錄下的Script/easy_install程式安裝virtualenv:
easy_install virtualenv
複製程式碼
- 用virtualenv建立工作區
virtualenv --no-site-packages env
複製程式碼
- 安裝pyramid 執行完上面的步驟後應該多了一個env檔案,cd 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})
複製程式碼