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