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.admingrok和 ^分别是{tt38}$。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何忽略缓冲读取器中在“”之后的行的其余部分,或行上的特定字符?   java在db中创建空对象或稍后保存   java如何实现UI无关的后台工作任务   java未能在Android中从BaseAdapter扩展的类中启动Tactivity?   java斐波那契迭代移动数组[]   安卓从文件读取提供了java。木卫一。StreamCorruptedException:无效的流标头:73720027   java计算矩形中的六边形数?   仅使用Java 1.5(或更早版本)读写XML   java如果所有元素都以相同的bucked结尾,为什么要进行大小调整?   java Apache POI Excel在xx中发现无法读取的内容。xlsx   swing我可以在普通java应用程序中使用GWTGUI吗?   来自自定义Java客户端的http删除请求的行为与邮递员不同   运行批处理文件时,java当前目录无效   使用TypeReference将java字符串转换为ArrayList<STRING>   documentlistener突出显示所有匹配词Java