Python Pyramid - Url 网址路由

在 MVC 架构出现之前,Web 应用程序使用将用户在浏览器中输入的 URL 映射到一个程序文件的机制,该程序文件的输出呈现为 HTML,以作为对浏览器的响应。 Pyramid 框架使用路由机制,其中 URL 的端点与应用程序注册表中注册的不同 URL 模式相匹配,调用其映射视图并呈现响应。

典型的 URL 由三部分组成:协议(例如 http:// 或 https://),后跟 IP 地址或主机名。 在主机名之后/之后的 URL 的剩余部分被称为路径或端点。

Mysite

端点后跟一个或多个可变部分构成路线。 可变部分标识符被大括号括起来。 例如,对于上面的 URL,路由是 /blog/{id}

WSGI 应用程序充当路由器。 它根据路由映射中存在的 URL 模式检查传入请求。 如果找到匹配项,则执行其关联的可调用视图并返回响应。


路由配置

路由配置

通过调用 Configurator 对象的 add_route() 方法将新路由添加到应用程序。 路由有一个名称,它充当用于 URL 生成的标识符和一个模式,用于匹配 URL (方案和端口后面的部分,例如 URL http://example.com/blog/1 中的 /blog/1) 的 PATH_INFO 部分。

如前所述,add_route()方法的pattern参数可以有一个或多个占位符标识符,用大括号括起来,用/隔开。 以下语句将"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 与索引路由匹配,因此显示以下输出 −

Root 根配置

路由配置中使用的模式通常以正斜杠 (/) 字符开头。 模式段(模式中 / 字符之间的单个项目)可以是文字字符串,也可以是占位符标记(例如,{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))

浏览器以dict对象的形式显示路径参数。

参数

当请求匹配路由模式时,传递给视图函数的请求对象还包含一个matched_route 属性。 匹配路由的名称可以从其名称属性中获取。

示例

在下面的示例中,我们在 @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()

输出

如果输入的 URL 为 http://localhost:6543/student/Ravi/21 时,输出是

{'name': 'Ravi', 'age': '21'}

如果输入的 URL 为 http://localhost:6543/book/Python/300,则输出为

Title: Python, Price: 300