跳转到主要内容

Django的基于类的邮件视图

项目描述

为Django框架提供基于类的电子邮件视图,包括消息预览器。

https://travis-ci.org/disqus/django-mailviews.png?branch=master

简介

在Django中渲染和发送电子邮件可能会变得重复且容易出错。通过在视图类中封装消息渲染,您可以轻松地以结构化和清晰的方式编写消息。

基本用法

from mailviews.messages import EmailMessageView

# Subclass the `EmailMessageView`, adding the templates you want to render.
class WelcomeMessageView(EmailMessageView):
    subject_template_name = 'emails/welcome/subject.txt'
    body_template_name = 'emails/welcome/body.txt'

# Instantiate and send a message.
message = WelcomeMessageView().send(extra_context={
    'user': user,
}, to=(user.email,))

这并不是发送消息给用户的最优模式 - 有关更好的方法,请参阅“最佳实践”下的注释。

使用预览站点

注册URL和启用发现

  • mailviews添加到项目配置的INSTALLED_APPS设置中。

  • 在项目的ROOT_URLCONF中添加以下内容

from mailviews.previews import autodiscover, site

autodiscover()

urlpatterns = patterns('',
    url(regex=r'^emails/', view=site.urls),
)

预览索引现在可在emails/ URL中访问。

创建预览类

要创建一个简单的预览,将emails.previews子模块添加到您的INSTALLED_APPS之一中,并创建一个Preview的新子类。

from mailviews.previews import Preview, site
from example.emails.views import WelcomeMessageView

# Define a new preview class.
class BasicPreview(Preview):
    message_view = WelcomeMessageView

# Register the preview class with the preview index.
site.register(BasicPreview)

您可以在测试套件中或mailviews.previews的代码文档中查看更多详细示例。

自定义预览行为

您还可以使用 Django 表单来自定义消息预览的创建,通过在您的 Preview 子类中添加一个 form_class 属性来实现。该表单必须提供一个 get_message_view_kwargs 方法,该方法返回用于构建消息视图实例的关键字参数。

最佳实践

  • 在发送电子邮件时,尽量少使用 extra_context 参数。相反,创建一个接受所有生成上下文和发送消息所需对象的 EmailMessageView 子类。例如,"基本用法" 中显示的代码可以改写为以下内容

from mailviews.messages import EmailMessageView

class WelcomeMessageView(EmailMessageView):
    subject_template_name = 'emails/welcome/subject.txt'
    body_template_name = 'emails/welcome/body.txt'

    def __init__(self, user, *args, **kwargs):
        super(WelcomeMessageView, self).__init__(*args, **kwargs)
        self.user = user

    def get_context_data(self, **kwargs):
        context = super(WelcomeMessageView, self).get_context_data(**kwargs)
        context['user'] = self.user
        return context

    def render_to_message(self, *args, **kwargs):
        assert 'to' not in kwargs  # this should only be sent to the user
        kwargs['to'] = (self.user.email,)
        return super(WelcomeMessageView, self).render_to_message(*args, **kwargs)

# Instantiate and send a message.
WelcomeMessageView(user).send()

实际上,您可能发现将上述“用户消息”模式封装到一个 mixin 或子类中很有帮助,该 mixin 或子类为所有与用户相关的电子邮件提供标准抽象。(这留作读者练习。)

测试和开发

已在 Python 2.6、2.7 和 3.4(如果 Django 支持)以及 Django 版本 1.3 至 1.8 上进行测试。(有关支持的具体版本,请参阅 Travis 或 Tox 构建矩阵。)要本地运行针对整个构建矩阵的测试,请运行 make test-matrix(或已安装的 tox)。

开发

要在开发模式下安装项目,请运行

make develop

这将安装依赖项,并构建静态资源。

测试

要针对您安装的 Django 版本运行测试套件,请运行

python -m mailviews.tests

要查看示例预览网站,可以通过运行以下命令启动测试服务器

python -m mailviews.tests.manage runserver

与第三方应用程序的集成

如果您使用 python manage.py test 运行测试并使 mailviews 包含在您的 settings.INSTALLED_APPS 中,所有测试将自动使用 Django 测试运行器运行。

覆盖率

要使用 coverage.py 生成覆盖率报告,请运行

coverage run --source=. -m mailviews.tests

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面