django web框架的用户通知管理

django-anonymous-notification的Python项目详细描述


用法

将通知支持集成到应用程序中是一个简单的三步过程。

  • create your notice types
  • create your notice templates
  • send notifications

创建通知类型

您需要调用create_notice_type(label, display, description)一次 在数据库中为应用程序创建通知类型。label只是 将用于类型display的内部短名称是 用户将看到通知类型的名称,并且说明是 简短的描述。

例如:

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通知,您的应用程序仍将继续。

注意,display和description参数被标记为 使用ugettext_noop。这将使您能够使用Django的makeMessages 管理命令和使用django通知的i18n功能。

通知模板

对于通知的实际内容,可以写入四个不同的模板:

  • ^{tt5}$ is a very short, text-only version of the notice (suitable for things like email subjects)
  • ^{tt6}$ is a longer, text-only version of the notice (suitable for things like email bodies)
  • ^{tt7}$ is a short, html version of the notice, displayed in a user’s notice list on the website
  • ^{tt8}$ is a long, html version of the notice (not currently used for anything)

每一个都应该放在模板路径上名为notification/<notice_type_label>/<template_name>的目录中。 如果其中任何一个丢失,将使用默认值。实际上,应该至少提供notice.htmlfull.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_nowqueue。它们都有相同的签名:

send(users, label, extra_context)

参数为:

  • ^{tt17}$ is an iterable of ^{tt18}$ objects to send the notification to.
  • ^{tt2}$ is the label you used in the previous step to identify the notice type.
  • ^{tt20}$ is a dictionary to add custom context entries to the template used to render to notification. This is optional.

send_nowvs.queuevs.send

让我们先分析一下每个人的工作。

send_now

这是一个阻塞调用,它将检查每个用户 请注意并实际发送。

queue

这是一个非阻塞调用,它将把调用排队到send_nowto 以后再执行。以后执行需要使用的调用 emit_notices管理命令。

send

围绕send_nowqueue的代理。它的行为来自全球 正在设置名为NOTIFICATION_QUEUE_ALL。默认情况下是False。这个 设置旨在帮助控制是否要将任何呼叫排队到 send

send还接受nowqueue关键字参数。默认情况下 每个选项都设置为False,以执行全局设置False。 这使您能够在每次调用的基础上覆盖它是否应该调用 send_nowqueue

可选通知支持

如果您想在可重用的应用程序中使用django通知,可以 在测试的条件子句中包装django通知的导入 如果是在发送通知之前安装的。因此,您的应用程序或 项目仍在不通知的情况下运行。

例如:

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})

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

推荐PyPI第三方库


热门话题
java使用EntityManager有没有更有效的习惯用法?   Android上的java Google应用程序引擎(GAE)响应代码和cookie   如何在Java中创建单元测试?   java从DB获取特定列的最新行   java替换所有悬空元字符   java使用Hibernate删除SQL表中的数据   swing显示JComponent对象Java   java在确认内容类型后如何将URL保存到文件?   javascript如何从段落中选择大量单词?(硒)   java在Linux上使用BundleEnableTiveCode不起作用   java使用日志似然性来比较不同的mallet主题模型?   java无法在Tomcat7上运行Spring Boot 2.0:“由于缺少ServletWebServerFactory bean,无法启动ServletWebServerApplicationContext。”   java有办法显式引用非静态内部类实例吗?   java如何使用Spring的NamedParameterJdbcTemplate在MySQL数据库中创建和删除表?