Python Pyramid Url 路由
在MVC架构出现之前,Web应用程序使用将用户在浏览器中输入的URL映射到一个程序文件的机制,该文件的输出将作为HTML呈现给浏览器作为响应返回。Pyramid框架使用路由机制,其中URL的终点与应用程序注册表中注册的不同URL模式匹配,调用其映射的视图并渲染响应。
一个典型的URL由三个部分组成:协议(例如http://或https://)后跟IP地址或主机名。主机名后的第一个/后的URL的剩余部分称为路径或终点。
终点加上一个或多个变量部分形成了路由。变量部分的标识符使用花括号括起来。例如,对于上述URL,路由是 /blog/{id}
WSGI应用程序充当路由器。它会将传入的请求与路由图中的URL模式进行匹配。如果找到匹配项,将执行与之关联的视图,并返回响应。
路由配置
可以通过调用Configurator对象的add_route()方法来向应用程序添加新路由。路由具有一个名称,该名称用作用于URL生成的标识符,以及一个用于匹配URL的PATH_INFO部分的模式(即在方案和端口之后的部分,例如URL中的/blog/1)。 http://example.com/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 包含与模式元素中的替换模式匹配的值。matchdict中的键是字符串,而其值是Unicode对象。
在前面的例子中,将index()视图函数更改为如下:
def index(request):
return Response(str(request.matchdict))
浏览器以字典对象的形式展示路径参数。
当请求匹配路由模式时,传递给视图函数的请求对象还包括一个 matched_route 属性。可以通过其name属性获取匹配路由的名称。
示例
在下面的示例中,我们使用@view.config()装饰器定义了两个视图函数student_view()和book_view()。
应用程序的注册表被配置为具有两个相应的路由- ‘student’映射到 ‘/student/{name}/{age}’ 模式,’book’映射到 ‘/book/{title}/{price}’ 模式。我们调用 configurator 对象的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