Python Pyramid 简明教程

Python Pyramid - Url Routing

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

典型的 URL 包含三个部分:协议(例如 http:// 或 https://),后面是 IP 地址或主机名。主机名之后,URL 的剩余部分称为路径或端点。

mysite

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

WSGI 应用充当路由器。它针对路由图中存在的 URL 模式检查传入请求。如果发现匹配,则执行与其关联的视图可调用对象,并返回响应。

Route Configuration

通过调用 Configurator 对象的 add_route() 方法,会向该应用添加一个新路由。路由有名称,该名称用作用于生成 URL 的标识符,还有一个模式,该模式用于与 URL 的 PATH_INFO 部分(方案和端口后面的部分,例如 URL http://example.com/blog/1). 中的 /blog/1)进行匹配。

如前所述,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')

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()

Output

运行上述代码,在浏览器中访问 http://localhost:6543/Ravi/21 。由于该 URL 的 PATH_INFO 与 index 路由匹配,因此显示以下输出:

root configuration

路由配置中使用的模式通常以正斜杠 (/) 字符开头。模式段(模式中 / 字符之间的单个项目)可以是字符串文字、占位符标记(例如,{name}),或二者的某种组合。替换标记无需以 / 字符开头。

以下是路由模式的一些示例

/student/{name}/{marks}
/{id}/student/{name}/{marks}
/customer/{id}/item/{itemno}
/{name}/{age}

占位符标识符必须是有效的 Python 标识符。因此,它必须以大写或小写 ASCII 字母或下划线开头,且只能包含大写或小写 ASCII 字母、下划线和数字。

Route Matching

当传入请求与与特定路由配置关联的 URL 模式匹配时,一个名为 matchdict 的字典对象作为请求对象的属性添加。

request.matchdict 包含匹配模式元素中替换模式的值。 matchdict 中的键为字符串,而其值为 Unicode 对象。

在上一个示例中,将 index() 视图函数更改为以下内容 −

def index(request):
   return Response(str(request.matchdict))

浏览器显示路径参数,其形式为 dict 对象。

parameters

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

Example

在以下示例中,我们定义了两个视图函数 student_view() 和 book_view() ,借助于 @view.config() 装饰器。

应用程序的注册表被配置为有两种对应的路由 - 映射到 '/student/{name}/{age}' 模式的 'student' 和映射到 '/book/{title}/{price}' 模式的 'book'。我们调用 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()

Output

当浏览器给出 http://localhost:6543/student/Ravi/21 URL 时,输出如下

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

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

Title: Python, Price: 300