在MVC架構(gòu)出現(xiàn)之前,Web應(yīng)用程序使用的機制是將用戶在瀏覽器中輸入的URL映射到一個程序文件,該文件的輸出被渲染成HTML,并作為一個響應(yīng)返回給瀏覽器。Pyramid框架使用了一種路由機制,URL的端點與應(yīng)用程序注冊表中注冊的不同URL模式相匹配,調(diào)用其映射的視圖并渲染響應(yīng)。
一個典型的URL由三部分組成。協(xié)議(如http:// 或 https://),然后是IP地址或主機名。在主機名之后的URL的剩余部分被稱為路徑或端點。
端點后面有一個或多個變量部分構(gòu)成路由。變量部分的標識符被大括號所包圍。例如,對于上述URL,路由是 /blog/{id} 。
WSGI應(yīng)用程序充當一個路由器。它根據(jù)路由圖中存在的URL模式檢查傳入的請求。如果找到一個匹配的,其相關(guān)的視圖可調(diào)用被執(zhí)行并返回響應(yīng)。
通過調(diào)用配置器對象的add_route()方法,一個新的路由被添加到應(yīng)用程序中。路由有一個名字,作為一個標識符,用于生成URL和一個模式,旨在與URL的PATH_INFO部分(方案和端口之后的部分,例如,URL http://example.com/blog/1 中的/blog/1 ) 相匹配。
如前所述,add_route()方法的模式參數(shù)可以有一個或多個占位符標識符,用大括號包圍,用/隔開。 以下語句將’index’指定為’/{name}/{age}’模式的路由名稱。
config.add_route('index', '/{name}/{age}')
為了將一個可調(diào)用的視圖關(guān)聯(lián)到這個路由,我們使用add_view()函數(shù),如下所示。
config.add_view(index, route_name='index')
index()函數(shù)應(yīng)該是可用的,以便與之匹配的路由。
def index(request):
return Response('Root Configuration Example')
我們把這些語句放在下面的程序中-
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
def index(request):
return Response('Root Configuration Example')
if __name__ == '__main__':
with Configurator() as config:
config.add_route('index', '/{name}/{age}')
config.add_view(index, route_name='index')
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
運行上述代碼并 在 瀏覽器 中 訪問 http://localhost:6543/Ravi/21 。由于URL的PATH_INFO與索引路由匹配,顯示如下輸出 ?
路由配置中使用的模式通常以一個正斜杠(/)字符開始。模式段(模式中/字符之間的單個項目)既可以是一個字面字符串,也可以是一個置換標記(例如,{name}),或者兩者的某種組合。一個替換標記不需要在前面加上一個/字符。
下面是一些路由模式的例子
/student/{name}/{marks}
/{id}/student/{name}/{marks}
/customer/{id}/item/{itemno}
/{name}/{age}
占位符必須是一個有效的Python標識符。因此,它必須以一個大寫或小寫的ASCII字母或下劃線開始,并且只能有大寫或小寫的ASCII字母、下劃線和數(shù)字。
當傳入的請求與特定路由配置相關(guān)的URL模式相匹配時,一個名為 matchdict 的字典對象被添加為請求對象的一個屬性。
request.matchdict 包含與pattern元素中的替換模式匹配的值。 matchdict 中的鍵是字符串,而其值是Unicode對象。
在前面的例子中,將index()視圖函數(shù)改為以下內(nèi)容 –
def index(request):
return Response(str(request.matchdict))
瀏覽器以 dict 對象的形式顯示路徑參數(shù)。
當請求與路由模式相匹配時,傳遞給視圖函數(shù)的請求對象也包括一個 matched_route 屬性。匹配路由的名稱可以從其name屬性中獲得。
在下面的例子中,我們有兩個視圖函數(shù)student_view()和book_view(),是在@view.config()裝飾器的幫助下定義的。
應(yīng)用程序的注冊表被配置為有兩個相應(yīng)的路由–“student “映射到 “/student/{name}/{age}” 模式,”book “映射到 “/book/{title}/{price}” 模式。我們調(diào)用 配置器 對象的scan()方法來添加這些視圖。
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.view import view_config
@view_config(route_name='student')
def student_view(request):
return Response(str(request.matchdict))
@view_config(route_name='book')
def book_view(request):
title=request.matchdict['title']
price=request.matchdict['price']
return Response('Title: {}, Price: {}'.format(title,price))
if __name__ == '__main__':
with Configurator() as config:
config.add_route('student', '/student/{name}/{age}')
config.add_route('book', '/book/{title}/{price}')
config.scan()
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
當瀏覽器被賦予 http://localhost:6543/student/Ravi/21 URL 時,輸出為
{'name': 'Ravi', 'age': '21'}
如果輸入的URL是 http://localhost:6543/book/Python/300 ,則輸出為
Title: Python, Price: 300
更多建議: