Grok消息传递机制
grokcore.message的Python项目详细描述
grokcore.message
这个包为grok提供了z3c.flashmessage的集成 设置。这意味着要注意:
- 向组件注册全局消息接收器 建筑技术。
- 默认情况下,注册基于全局会话的消息源 session。
- 可选(如果包括ram.zcml)注册全局RAM 存储的消息源名为ram
- 提供组件以使用全局消息接收器和 消息来源
关于我们在这里谈论的是什么样的信息, 请参阅z3c.flashmessage文档。
内容
Setting up ^{tt4}$
当被搜索时,grokcore.message寄存器
- 名为session 的全局会话消息源
- 全局消息接收器
当本地configure.zcml为 执行。在基于grok的标准包中,这种情况经常发生 自动
当然,也可以手动摸索包裹:
>>> import grokcore.component as grok >>> grok.testing.grok('grokcore.message')
此设置全局消息接收器:
>>> from z3c.flashmessage.interfaces import IMessageReceiver >>> from zope.component import getUtility >>> getUtility(IMessageReceiver) <z3c.flashmessage.receiver.GlobalMessageReceiver object at 0x...>
它还设置一个基于会话的消息源,名为session:
>>> from z3c.flashmessage.interfaces import IMessageSource >>> getUtility(IMessageSource, name=u'session') <z3c.flashmessage.sources.SessionMessageSource object at 0x...>
我们还提供了一个ram存储的消息源,可以通过 包括ram.zcml,默认情况下不注册:
>>> getUtility(IMessageSource, name=u'ram') Traceback (most recent call last): ... zope.interface.interfaces.ComponentLookupError: (<InterfaceClass z3c.flashmessage.interfaces.IMessageSource>, 'ram')
您可以通过包含ram.zcml来启用此源 grokcore.message在zcml设置中,如下所示:
<configure xmlns="http://namespaces.zope.org/zope"> <include package="grokcore.message" file="ram.zcml" /> </configure>
当然,也可以手动注册rammessagesource:
>>> from zope.component import provideUtility >>> from z3c.flashmessage.sources import RAMMessageSource >>> ram_source = RAMMessageSource() >>> provideUtility(ram_source, name=u'ram')
现在我们可以获取RAM源:
>>> getUtility(IMessageSource, name=u'ram') <z3c.flashmessage.sources.RAMMessageSource object at 0x...>
Components (API)
grokcore.message提供了一些额外的组件和函数 除了来自z3c.flashmessage的常用组件之外。
UniqueMessageSource
UniqueMessageSource是一个完全保留零的消息源 或者一条信息注意,消息不是持久存储在 UniqueMessageSource实例,重新启动后将丢失 你的Zope实例
它是基类,这意味着您必须从它派生到 在您的软件存在时将实例注册为全局实用程序 grokked(见下面的示例)
方法:
- UniqueMessageSource.send(message[, type=u’message’])
- Send a message ^{tt17}$ of type ^{tt18}$.
- UniqueMessageSource.list(type=None)
- Returns a generator object listing the message if one is stored.
- UniqueMessageSource.delete(message)
- Delete the message stored from source, if ^{tt17}$ is this message.
Convenience functions
grokcore.message为 提供源或从中获取数据。
grokcore.message.send(消息[,type=”消息“[,name=”会话“]])
Send ^{tt17}$ to the message source ^{tt22}$.
Returns ^{tt23}$ if the message could be sent successfully. Otherwise ^{tt24}$ is returned:
>>> import grokcore.message >>> grokcore.message.send('Meet at dawn!') True>>> grokcore.message.send('Meat a fawn!', name='doesnotexist') False
grokcore.message.get_from_source([name='')
Get a list of messages stored at message source registered under name ^{tt22}$ or ^{tt26}$.
This action never deletes messages from the queried source.
>>> import grokcore.message >>> grokcore.message.get_from_source('session') <generator object ...>>>> grokcore.message.get_from_source('not-existing') is None True
grokcore.message.receive([name='')
Receive the messages collected by the receiver registered under name ^{tt22}$.
>>> import grokcore.message >>> msgs = list(grokcore.message.receive()) >>> msgs [<z3c.flashmessage.message.Message object at 0x...>]>>> msgs[0].message 'Meet at dawn!'Please note, that this action might delete messages from the sources they have been sent to as by ‘receiving’ messages you indicate that the messages have been processed.
The session source for instance is now empty:
>>> list(grokcore.message.get_from_source('session')) []Receiving again will give no results:
>>> list(grokcore.message.receive()) []
Examples
创建UniqueMessageSource:
>>> from grokcore.message import UniqueMessageSource >>> class MyUniqueMessageSource(UniqueMessageSource): ... grok.name('uniq_source')
搜索后,会自动注册源:
>>> grok.testing.grok_component( ... 'MyUniqueMessageSource', MyUniqueMessageSource, ... dotted_name='grokcore.message.tests') True>>> source = getUtility(IMessageSource, name='uniq_source') >>> source <...MyUniqueMessageSource object at 0x...>
它提供imessagesource接口所需的方法:
>>> from z3c.flashmessage.interfaces import IMessageSource >>> from zope.interface import verify>>> verify.verifyClass(IMessageSource, MyUniqueMessageSource) True
我们可以列出存储在源中的消息:
>>> source.list() <generator object ...>>>> list(source.list()) []>>> source.send(message='Hello!', type='message') >>> list(source.list()) [<z3c.flashmessage.message.PersistentMessage object at 0x...>]>>> print(list(source.list())[0].message) Hello!
当我们发送另一条消息时,旧消息将被愚蠢地丢弃:
>>> source.send(message='Hello again!', type='message') >>> len(list(source.list())) 1>>> print(list(source.list())[0].message) Hello again!
我们可以删除消息:
>>> msg = list(source.list())[0] >>> source.delete(msg) >>> len(list(source.list())) 0
方便功能的示例可以在上面找到
CHANGES
3.0.1 (2018-01-17)
- 用@grok.implementer()替换grok.implements()的用法 全程指导
3.0.0 (2018-01-15)
- python 3兼容性。
0.4.3 (2016-02-15)
- 更新测试。
0.4.2 (2010-10-25)
- 通过明确注册iclientidmanager和 ISessionDataContainer实用程序。为此重新引入ftesting.zcml。
0.4.1 (2010-10-25)
- 删除未删除的ftesting.zcml必要的。
0.4 (2010-10-25)
- 确保配置了zope.session,因为这个包声称提供了 用于基于会话的flash消息机制
- 使包符合zope.org存储库策略
0.3 (2010-03-05)
- UniqueMessageSource现在实现IMessageSource 完全接口,即type参数现在是可选的 使用UniqueMessageSource.send()时。
0.2 (2010-03-03)
- 实用函数send现在接受一个name参数, 允许选择目标消息源。
0.1 (2010-03-03)
- 从grokui.admin、grok和 ^分别是{tt38}$。