pyramid.events

功能

subscriber(*ifaces, **predicates)[源代码]

通过激活装饰器 scan 它将被修饰的函数视为传递给 *ifaces 以及作为 **predicates 到decorator构造函数。

例如:

from pyramid.events import NewRequest
from pyramid.events import subscriber

@subscriber(NewRequest)
def mysubscriber(event):
    event.request.foo = 1

可以将多个事件类型作为构造函数参数传递。将为每种事件类型调用经过修饰的订户。

from pyramid.events import NewRequest, NewResponse
from pyramid.events import subscriber

@subscriber(NewRequest, NewResponse)
def mysubscriber(event):
    print(event)

subscriber 使用decorator时不传递参数,对发送的每个事件调用它所修饰的函数:

from pyramid.events import subscriber

@subscriber()
def mysubscriber(event):
    print(event)

此方法在 scan 对包含它的包或模块执行,ala:

from pyramid.config import Configurator
config = Configurator()
config.scan('somepackage_containing_subscribers')

任何 **predicate 参数将传递给 pyramid.config.Configurator.add_subscriber() . 见 订阅服务器谓词 有关谓词如何缩小将调用订阅服务器的环境集的描述。

将传递给 venusian attach 函数是 _depth_category .

_depth 是为希望从另一个装饰器重用此类的人提供的。默认值为 0 并且应该相对于 subscriber 调用。它将传递给 venusian attach 当Venusian检查装饰器是否在类或模块上下文中使用时,函数作为调用堆栈的深度。它不常用,但在这种情况下可能有用。

_category 设置装饰器类别名称。它可以与 category 的参数 scan 控制应处理哪些视图。

venusian.attach() 在金星函数中获取更多关于 _depth_category 争论。

在 1.9.1 版更改: 增加了 _depth_category 争论。

事件类型

class ApplicationCreated(app)[源代码]

此类的实例作为 eventpyramid.config.Configurator.make_wsgi_app() 被称为。实例有一个属性, app ,它是 router 这将处理wsgi请求。此类实现 pyramid.interfaces.IApplicationCreated 接口。

注解

为了向后兼容的目的,这个类也可以作为 pyramid.events.WSGIApplicationCreatedEvent . 这是以前事件类的名称 Pyramid

class NewRequest(request)[源代码]

此类的实例作为 event 无论何时 Pyramid 开始处理新请求。事件实例有一个属性, request ,这是一个 request 对象。此事件类实现 pyramid.interfaces.INewRequest 接口。

class ContextFound(request)[源代码]

此类的实例作为 eventPyramid router 找到一个 context 对象(在执行遍历之后),但在执行任何视图代码之前。实例有一个属性, request ,它是由 Pyramid .

值得注意的是,请求对象将具有一个名为 context ,这是将提供给最终将被调用的视图的上下文,以及上下文查找代码附加的其他属性。

此类实现 pyramid.interfaces.IContextFound 接口。

注解

至于 Pyramid 1.0,为了向后兼容的目的,此事件也可以导入为 pyramid.events.AfterTraversal .

class BeforeTraversal(request)[源代码]

此类的实例作为 eventPyramid router 已尝试查找 route 对象,但在执行任何遍历或视图代码之前。实例有一个属性, request ,它是由 Pyramid .

值得注意的是,请求对象 may 具有名为的属性 matched_route ,如果找到匹配的路由。如果没有匹配的路由,则此属性不可用。

此类实现 pyramid.interfaces.IBeforeTraversal 接口。

class NewResponse(request, response)[源代码]

此类的实例作为 event 无论何时 Pyramid viewexception view 返回A response .

实例有两个属性:“‘请求’”,这是导致响应的请求,以及 response ,这是视图或渲染器返回的响应对象。

如果 response 是由 exception view ,请求将具有一个名为 exception ,这是导致执行异常视图的异常对象。如果响应是由“普通”视图生成的,则请求的此属性将 None .

如果由于异常视图未捕获的异常而无法创建响应,则不会生成此事件(在此情况下不会创建响应)。

此类实现 pyramid.interfaces.INewResponse 接口。

注解

在wsgi中,对响应进行后处理通常会更好地处理。 middleware 组件,而不是由 pyramid.interfaces.INewResponse 事件。这个 pyramid.interfaces.INewResponse 事件的存在几乎完全是为了与 pyramid.interfaces.INewRequest 事件。

class BeforeRender(system, rendering_val=None)[源代码]

此事件的订阅服务器可能会反省和修改 renderer globals 在他们被传给 renderer . 此事件对象本身具有类似字典的接口,可以用于此目的。例如::

from pyramid.events import subscriber
from pyramid.events import BeforeRender

@subscriber(BeforeRender)
def add_global(event):
    event['mykey'] = 'foo'

此类型的对象将作为事件发送到 renderer 被调用。

如果订户通过添加密钥 __setitem__ 它已经存在于renderer globals字典中,它将覆盖那里的旧值。这可能有问题,因为BeforeRender事件的事件订阅服务器不具有任何相对顺序。为了与其他第三方订阅服务器实现最大的互操作性,如果您编写了一个事件订阅服务器,打算用作beforerender订阅服务器,则在设置覆盖值(可以使用 .get__contains__ 事件对象)。

从视图返回的词典可以通过 rendering_val 的属性 BeforeRender 事件。

假设你回来了 {{'mykey': 'somevalue', 'mykey2': 'somevalue2'}} 从你的角度来看,可调用,比如:

from pyramid.view import view_config

@view_config(renderer='some_renderer')
def myview(request):
    return {'mykey': 'somevalue', 'mykey2': 'somevalue2'}

rendering_val 可用于从 BeforeRender 对象:

from pyramid.events import subscriber
from pyramid.events import BeforeRender

@subscriber(BeforeRender)
def read_return(event):
    # {'mykey': 'somevalue'} is returned from the view
    print(event.rendering_val['mykey'])

换言之, rendering_val 是视图返回的(非系统)值还是传递给 render* 作为 value . 这是金字塔1.2中的新功能。

有关渲染器全局字典中存在值的描述,请参见 渲染期间使用的系统值 .

update(E, **F)

从dict/iterable e和f中更新d。如果e有.keys()方法,则在e:d中对k执行:操作 [k] = e [k] 如果e缺少.keys()方法,则执行:对于e:d中的(k,v) [k] =V。无论哪种情况,后面都是:对于f:d中的k [k] = f [k] .

clear() → None. Remove all items from D.
copy() → a shallow copy of D
fromkeys()

返回一个新dict,其中键来自iterable,值等于value。

get(k[, d]) → D[k] if k in D, else d. d defaults to None.
items() → a set-like object providing a view on D's items
keys() → a set-like object providing a view on D's keys
pop(k[, d]) → v, remove specified key and return the corresponding value.

如果找不到键,则返回d(如果给定),否则将引发keyError

popitem() → (k, v), remove and return some (key, value) pair as a

2元组;但如果d为空,则引发keyror。

setdefault(k[, d]) → D.get(k,d), also set D[k]=d if k not in D
values() → an object providing a view on D's values

使用事件 有关如何注册订阅这些事件的代码的详细信息。