Python Pyramid Url路由
在MVC架构出现之前,Web应用程序使用的机制是将用户在浏览器中输入的URL映射到一个程序文件,该文件的输出被渲染成HTML,并作为一个响应返回给浏览器。Pyramid框架使用了一种路由机制,URL的端点与应用程序注册表中注册的不同URL模式相匹配,调用其映射的视图并渲染响应。
一个典型的URL由三部分组成。协议(如http:// 或 https://),然后是IP地址或主机名。在主机名之后的URL的剩余部分被称为路径或端点。
端点后面有一个或多个变量部分构成路由。变量部分的标识符被大括号所包围。例如,对于上述URL,路由是 /blog/{id} 。
WSGI应用程序充当一个路由器。它根据路由图中存在的URL模式检查传入的请求。如果找到一个匹配的,其相关的视图可调用被执行并返回响应。
路由配置
通过调用配置器对象的add_route()方法,一个新的路由被添加到应用程序中。路由有一个名字,作为一个标识符,用于生成URL和一个模式,旨在与URL的PATH_INFO部分(方案和端口之后的部分,例如,URL http://example.com/blog/1 中的/blog/1 ) 相匹配。
如前所述,add_route()方法的模式参数可以有一个或多个占位符标识符,用大括号包围,用/隔开。 以下语句将’index’指定为’/{name}/{age}’模式的路由名称。
config.add_route('index', '/{name}/{age}')
为了将一个可调用的视图关联到这个路由,我们使用add_view()函数,如下所示。
config.add_view(index, route_name='index')
index()函数应该是可用的,以便与之匹配的路由。
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字母、下划线和数字。
路线匹配
当传入的请求与特定路由配置相关的URL模式相匹配时,一个名为 matchdict 的字典对象被添加为请求对象的一个属性。
request.matchdict 包含与pattern元素中的替换模式匹配的值。 matchdict 中的键是字符串,而其值是Unicode对象。
在前面的例子中,将index()视图函数改为以下内容 –
def index(request):
return Response(str(request.matchdict))
浏览器以 dict 对象的形式显示路径参数。
当请求与路由模式相匹配时,传递给视图函数的请求对象也包括一个 matched_route 属性。匹配路由的名称可以从其name属性中获得。
例子
在下面的例子中,我们有两个视图函数student_view()和book_view(),是在@view.config()装饰器的帮助下定义的。
应用程序的注册表被配置为有两个相应的路由–“student “映射到 “/student/{name}/{age}” 模式,”book “映射到 “/book/{title}/{price}” 模式。我们调用 配置器 对象的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