Django Web框架的用户通知管理
项目描述
使用方法
将通知支持集成到您的应用程序是一个简单的三步过程。
创建您的通知类型
创建您的通知模板
发送通知
创建通知类型
您需要调用一次 create_notice_type(label, display, description) 来在数据库中创建您的应用程序的通知类型。 label 仅是用于类型的内部短名称,display 是用户将看到的通知类型名称,description 是简短描述。
例如
notification.create_notice_type("friends_invite", "Invitation Received", "you have received an invitation")
自动执行此通知类型创建的一个好方法是在您的应用的 management.py 文件中,将其附加到 syncdb 信号。以下是一个示例
from django.conf import settings from django.db.models import signals from django.utils.translation import ugettext_noop as _ if "notification" in settings.INSTALLED_APPS: from notification import models as notification def create_notice_types(app, created_models, verbosity, **kwargs): notification.create_notice_type("friends_invite", _("Invitation Received"), _("you have received an invitation")) notification.create_notice_type("friends_accept", _("Acceptance Received"), _("an invitation you sent has been accepted")) signals.post_syncdb.connect(create_notice_types, sender=notification) else: print "Skipping creation of NoticeTypes as notification app not found"
请注意,代码被包裹在条件语句中,因此如果 django-notification 未安装,您的应用程序仍然会继续。
请注意,display 和 description 参数已通过使用 ugettext_noop 标记为翻译。这将使您能够使用 Django 的 makemessages 管理命令并使用 django-notification 的 i18n 功能。
通知模板
可以编写四个不同的模板来通知的实际内容
short.txt 是通知的一个非常短的纯文本版本(适用于像电子邮件主题这样的东西)
full.txt 是通知的一个较长的纯文本版本(适用于像电子邮件正文这样的东西)
notice.html 是通知的一个简短的HTML版本,在网站上显示在用户的公告列表中
full.html 是通知的一个长HTML版本(目前未用于任何事情)
每个都应该放在模板路径上的一个名为 notification/<notice_type_label>/<template_name> 的目录中。如果这些文件中任何一个缺失,将会使用默认值。在实践中,至少应提供 notice.html 和 full.txt。
例如,notification/friends_invite/notice.html 可能包含
{% load i18n %}{% url invitations as invitation_page %}{% url profile_detail username=invitation.from_user.username as user_url %} {% blocktrans with invitation.from_user as invitation_from_user %}<a href="{{ user_url }}">{{ invitation_from_user }}</a> has requested to add you as a friend (see <a href="{{ invitation_page }}">invitations</a>){% endblocktrans %}
以及 notification/friends/full.txt 可能包含
{% load i18n %}{% url invitations as invitation_page %}{% blocktrans with invitation.from_user as invitation_from_user %}{{ invitation_from_user }} has requested to add you as a friend. You can accept their invitation at: http://{{ current_site }}{{ invitation_page }} {% endblocktrans %}
上下文变量在发送通知时提供。
发送通知
发送通知有两种不同的方式。我们支持发送通知的阻塞和非阻塞方法。发送通知最简单的方式,例如
notification.send([to_user], "friends_invite", {"from_user": from_user})
需要注意的是,send 是围绕 send_now 或 queue 的一个代理。它们都有相同的签名
send(users, label, extra_context)
参数如下
users 是一个要发送通知的 User 对象的可迭代序列。
label 是你在上一步中使用的标签,用于识别通知类型。
extra_content 是一个字典,用于向渲染通知的模板中添加自定义上下文条目。这是可选的。
send_now 与 queue 与 send
让我们首先分解每个的作用。
send_now
这是一个阻塞调用,它将检查每个用户的资格,并实际执行发送。
queue
这是一个非阻塞调用,它将调用 send_now 并将其排队,以便稍后执行。要稍后执行调用,您需要使用 emit_notices 管理命令。
send
这是 send_now 和 queue 的代理。它的行为来自一个名为 NOTIFICATION_QUEUE_ALL 的全局设置。默认情况下,它为 False。此设置旨在帮助控制您是否希望排队任何对 send 的调用。
send 还接受 now 和 queue 关键字参数。默认情况下,每个选项都设置为 False,以尊重全局设置,该设置为 False。这允许您在每个调用的基础上覆盖是否应调用 send_now 或 queue。
可选通知支持
如果您想在可重用应用中使用 django-notification,您可以在发送通知之前将 django-notification 的导入包裹在一个条件语句中,该语句测试它是否已安装。因此,即使您的应用或项目没有通知功能,也能正常工作。
例如
from django.conf import settings if "notification" in settings.INSTALLED_APPS: from notification import models as notification else: notification = None
然后,稍后
if notification: notification.send([to_user], "friends_invite", {"from_user": from_user})