Python Pyramid 视图配置
术语“视图配置”是指将视图可调用(函数、方法或类)与路由配置信息关联起来的机制。Pyramid将为给定的URL模式找到最佳的可调用对象。
有三种配置视图的方法:
- 使用add_view()方法
-
使用@view_config()装饰器
-
使用@view_defaults()类装饰器
使用add_view()方法
这是通过调用Configurator对象的add_view()方法来以命令方式配置视图的最简单方法。
该方法使用以下参数:
- name - 要匹配此视图可调用对象的视图名称。如果未提供name,则使用空字符串(表示默认视图)。
-
context - 该资源必须是Python类的对象,以便找到并调用此视图。如果未提供context,则使用值None,表示匹配任何资源。
-
route_name - 此值必须匹配一个路由配置声明的名称,在调用此视图之前必须匹配。如果提供了route_name,则仅当命名路由匹配时才会调用视图可调用对象。
-
request_type - 请求中必须提供的一个接口,以便找到并调用此视图。
-
request_method - 表示HTTP请求方法的字符串(例如”GET”,”POST”,”PUT”,”DELETE”,”HEAD”或”OPTIONS”)或包含一个或多个这些字符串的元组。只有当请求的method属性与提供的值匹配时,才会调用视图。
-
request_param - 此参数可以是任意字符串或字符串序列。只有当请求的params字典有一个与提供的值匹配的键时,才会调用视图。
示例
在以下示例中,定义了两个函数getview()和postview(),并将它们与相同名称的两个路由关联起来。这些函数只返回调用它们的HTTP方法的名称。
在请求使用GET方法请求URL /get时,将调用getview()函数。类似地,在请求路径为/post的POST方法时,将执行postview()函数。
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
def getview(request):
ret=request.method
return Response('Method: {}'.format(ret))
def postview(request):
ret=request.method
return Response('Method: {}'.format(ret))
if __name__ == '__main__':
with Configurator() as config:
config.add_route('getview', '/get')
config.add_route('postview', '/post')
config.add_view(getview, route_name='getview',request_method='GET')
config.add_view(postview,route_name='postview', request_method='POST')
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
虽然可以使用网页浏览器作为HTTP客户端发送GET请求,但不能用于POST请求。因此,我们使用CURL命令行工具。
C:\Users\Acer>curl localhost:6543/get
Method: GET
C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X POST http://localhost:6543/post
Method: POST
如前所述, request_method 参数可以是一个或多个 HTTP 方法的列表。让我们修改上面的程序,定义一个单一的 oneview() 函数来确定触发其执行的 HTTP 方法。
def oneview(request):
ret=request.method
return Response('Method: {}'.format(ret))
此功能在应用程序的配置中为所有HTTP方法注册。
config.add_route('oneview', '/view')
config.add_view(oneview, route_name='oneview',
request_method=['GET','POST', 'PUT', 'DELETE'])
输出
以下是CURL的输出结果:
C:\Users\Acer>curl localhost:6543/view
Method: GET
C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X POST http://localhost:6543/view
Method: POST
C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X PUT http://localhost:6543/view
Method: PUT
C:\Users\Acer>curl -X DELETE http://localhost:6543/view
Method: DELETE
使用@view_config()装饰器
可以使用@view_config装饰器将已配置的路由与函数、方法甚至可调用类关联起来,而不是采用命令式添加视图的方式。
示例
如在声明式配置部分所述,注册的路由可与函数关联,示例如下:
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='hello')
def hello_world(request):
return Response('Hello World!')
if __name__ == '__main__':
with Configurator() as config:
config.add_route('hello', '/')
config.scan()
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
注意,只有在调用scan()方法之后,视图才会被添加到应用的配置中。虽然不需要命令式地添加视图,但性能可能会稍微慢一些。
输出
view_config()装饰器也可以提供与add_view()方法相同的参数。所有参数都可以省略。
@view_config()
def hello_world(request):
return Response('Hello World!')
在这种情况下,该函数将注册为任何路由名称、任何请求方法或参数。
view_config装饰器放在可调用视图函数的定义之前,如上例所示。如果要将其用作可调用视图,也可以将其放在类的顶部。这样的类必须有一个__call__()
方法。
在下面的金字塔应用代码中,MyView类被用作可调用对象,并通过@view_config装饰器进行装饰。
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='hello')
class MyView(object):
def __init__(self, request):
self.request = request
def __call__(self):
return Response('hello World')
if __name__ == '__main__':
with Configurator() as config:
config.add_route('hello', '/')
#config.add_view(MyView, route_name='hello')
config.scan()
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
请注意,我们可以通过显式调用add_view()方法来添加视图配置,而不是扫描视图配置。
示例
如果一个类的方法必须与不同的路由相关联,应在每个方法的顶部使用单独的@view_config(),如下面的示例所示。在这个例子中,我们有两个方法绑定到两个不同的路由。
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.view import
class MyView(object):
def __init__(self, request):
self.request = request
@view_config(route_name='getview', request_method='GET')
def getview(self):
return Response('hello GET')
@view_config(route_name='postview', request_method='POST')
def postview(self):
return Response('hello POST')
if __name__ == '__main__':
with Configurator() as config:
config.add_route('getview', '/get')
config.add_route('postview', '/post')
config.scan()
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
输出
这是CURL命令的输出结果 –
C:\Users\Acer>curl localhost:6543/get
hello GET
C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X POST http://localhost:6543/post
hello POST
使用@view_defaults()装饰器
view_defaults() 是一个类装饰器。如果你需要将方法添加为具有一些通用参数和特定参数的视图方法,通用参数可以在类的顶部使用 view_defaults() 装饰器指定,通过每个方法的单独 view_config() 进行配置。
示例
在以下代码中,我们有不同的方法响应相同的路由,但具有不同的 request_method
因此,我们将路由名称定义为默认,并在每个视图配置中指定请求方法。
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.view import view_config
from pyramid.view import view_defaults
@view_defaults(route_name='myview')
class MyView(object):
def __init__(self, request):
self.request = request
@view_config( request_method='GET')
def getview(self):
return Response('hello GET')
@view_config(request_method='POST')
def postview(self):
return Response('hello POST')
@view_config(request_method='PUT')
def putview(self):
return Response('hello PUT')
@view_config(request_method='DELETE')
def delview(self):
return Response('hello DELETE')
if __name__ == '__main__':
with Configurator() as config:
config.add_route('myview', '/view')
config.scan()
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
输出
对服务器进行不同HTTP请求的CURL命令如下:
C:\Users\Acer>curl localhost:6543/view
hello GET
C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X POST http://localhost:6543/view
hello POST
C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X PUT http://localhost:6543/view
hello PUT
C:\Users\Acer>curl -X DELETE http://localhost:6543/view
hello DELETE