django的简单但丰富的声明性通知框架

Ahem的Python项目详细描述


ahem
===

声明式风格,就像django模型一样。


installation
===




pip install ahem

代码::python

代码::python

settings.py


'task':'mytasks.the_taks',
'schedule':crontab(…),
}
}


documentation
====


如果芹菜库可以导入,它将尝试异步发送通知,否则它将在调用它的同一线程中发送通知。
没有芹菜,周期性通知将不起作用。

tem,请小心。


notifications
----


若要定义通知,请在项目的任何已安装应用程序中创建"notifications.py"文件,并创建扩展ahem
``notification``类的类。

代码::python

my django\u app/notifications.py


from datetime import timedelta
from ahem.notification import notification
from ahem.scopes import querysetscope
from ahem.triggers import delayedtrigger

class myprojectnotification(notifica操作:
name='我的项目'

trigger=delayedtrigger(timedelta(days=1))

backends=['电子邮件']
templates={
'默认值':'路径/到/模板.html'}

-`` name`将用作您的通知,它在您的项目中应该是
唯一的。
-``scope``定义哪些用户将收到通知。
-``trigger``定义如何和何时触发通知。
-``backends``是
通知的可用后端名称列表。
-``带有模板的字典模板``字典模板``字典模板``字典模板`字典模板``字典模板``字典模板``字典模板`字典模板将用于每个后端的每个后端。






<
<
<获取上下文数据数据(自、用户、后端名称、后端名称,\*\\*夸加值)









~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~添加更多变量到
上下文。``默认情况下,user``被添加到上下文中,如果覆盖,请记住调用
``super`'。

代码::python

类通知(通知):

def get_context_data(self,user,backend_name,**kwargs):
kwargs=super(通知,self)。获取_context_data(
user,backend_name,**kwargs)
kwargs['extra_context']='这将显示在通知'
return kwargs

后端
--


当前,``emailbackend`'是唯一可用的后端。我们鼓励开发人员构建新的存储库,然后通过pull请求合并到这个存储库中。


在后端注册用户
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

在使用特定后端向用户发送通知之前,您需要注册它。

代码::python

询问。将使用"用户"电子邮件。

帐篷类型。

scheduling a notification
----


使用"schedule"方法触发通知。使用
``context``kwarg将上下文字典传递给通知。

…代码::python

/>~~~~~~~~~~~~~~~~~~~~~

代码::python

myprojectnotification.schedule(backends=['email'])


overriding trigger
~~~~~~~~~~~~~~~~~~


代码::python

通知将在23:45从芹菜发送。schedules导入crontab
myprojectnotification.schedule(eta=crontab(crontab(hour=23,minute=45))

elta
myprojectnotification.schedule(delay_timedelta=timedelta(minutes=20))

scopes
----


scopes是一种声明性方式,用于选择在执行通知时哪些用户将接收到该通知。默认情况下,ahem有两个作用域,
,但如果您感到冒险,则可以在新的作用域上构建。

~~~~~~~~~~~~~~~~

``querysetscope``将返回所有用户,如果没有参数通过,但您可以通过queryset来筛选所需的参数。

代码::python

from ahem.scopes import querysetscope


类通知(通知):

scope=querysetscope(user.objects.filter(is_staff=true))


terscope
~代码::python

from ahem.scopes import contextfilterscope
class通知(通知):

scope=contextfilterscope(
context key='user'u is'u admin',lookup'u field='is'u admin')


仅对非管理员用户执行操作
通知。计划(context={user-is-admin':false})


筛选作用域(self、queryset、context)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
通过添加"筛选作用域"方法,可以在"通知作用域"中执行额外的筛选。收到你的通知。此方法应返回"user"列表。代码::python

return queryset.filter(first_name='camila').all()


triggers
--


triggers定义何时发送通知。目前可用的触发器有两种:``DelayedTrigger``和``CalendarTrigger``,
,但是您也可以通过扩展``NotificationTrigger``来编写自定义触发器。

Delayed触发器
~~~~~~~~~~~~~~~~~

``delayedtrigger``\s应接收一个时间增量作为其第一个参数。
这将指定在发送
通知之前应等待多长时间。如果未指定timedelta,则会立即发送通知。你可以选择在"每小时"和/或"每分钟"关卡通过。通过这样做,将timedelta添加到
当前时间后,小时和分钟将被覆盖到您指定的时间。代码::python

from datetime import timedelta
from ahem.triggers import delayedtrigger

nute=0)


~~~~~~~~~~~~~~~~~~~

``calendarTrigger``是定期通知,使用``celeri`
``crontab``定义其周期性。有关
更多信息,请参见"芹菜"文档:
http://celeriy.readthedocs.org/en/latest/userguide/periodic tasks.html crontab schedules

。代码::python

from celeriry.schedules import crontab
from ahem.triggers import calendarTrigger





模板
----

``templates``指定应使用哪个模板呈现通知内容。应该至少有一个"默认"模板,
,但您可以为每个后端指定不同的模板。当呈现
模板时,所有上下文变量都将可用。

…代码::python

类通知(通知):

模板={
"默认":"路径/to/your/template.html",
"电子邮件":"路径/to/email/template.html"}

测试
----

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

推荐PyPI第三方库


热门话题
由于java的原因,maven无法运行代码。lang.NoClassDefFoundError:com/fasterxml/jackson/annotation/JsonMerge   Android项目中的java Creative SDK图像编辑器UI   java如何在Android Studio中使用DataOutputStream上传文件并将其他参数传递到web服务器   java倒计时服务打开时崩溃   java将RubyonRails项目转换为JRubyonRails项目   java我的图库意图是不显示图像?为什么?   java如何在春季启动时跳过mongodb/   java@Autowired在Spring中是如何实现的   甲骨文Akka java。util。同时发生的timeoutexception线程池频繁超时   java maven依赖项对spring启动应用程序有何影响?   java Firestore执行复合查询,未截获事件“已修改”   java ItemStreamException:未能初始化读取器,原因是:IllegalStateException:流已初始化。重新开放前关闭   java将空标记解组到集合的新实例中   使用AspectJ的java新手:无法调用aspect   java查找棋类游戏的所有组合   你为什么要这样做and==与Java中的equals方法不一样吗?   如何对使用JavaUUID的代码进行单元测试?