在Pyramid.ini-fi中配置不同的电子邮件后端

2024-05-28 18:46:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Pyramid开发一个相当基本的应用程序。该应用程序包括发送电子邮件的功能。目前我打算使用Sendgrid来实现这个目的,但不想把它耦合得太紧。另外,我不希望在开发或测试期间发送任何电子邮件。我的解决方案是为每个提供者创建轻量级中间件类,所有类都提供一个send()方法。在

我想松散耦合可以通过使用^{}对象来实现,但我还没有完全做到。在

如果给定以下代码(注意没有request,因为我想通过Celery调用它):

def send_email(sender, recipient, subject, contents):
    emailer = get_emailer()
    emailer.send(from=sender, to=receipient, subject=subject, body=contents)

假设我的开发.ini包含类似pyramid.includes = my_app.DumpToConsoleEmailer的内容?在


Tags: 中间件方法目的功能sendpyramid应用程序电子邮件
2条回答

自从一个月前提出这个问题以来,我已经读了一点书。这让我找到了两种可能的解决方案:

A) 惯用金字塔

我们要解决两个问题:

  1. 如何为金字塔应用程序全局设置在PasteDeploy配置文件(.ini文件)中指定的类
  2. 如何在运行时访问我们的类而不需要“遍历”请求

要设置指定的类,我们应该在模块中定义一个includeme()函数,然后在.ini文件中指定该模块作为pyramid.includes的一部分。在我们的includeme()函数中,我们使用config.registry.registerUtility(),它是{a1}的一部分,注册我们的类和它实现的interface。在

为了在运行时访问我们的类,我们需要调用registry.queryUtility(),从pyramid.threadlocal.get_current_registry()获取{}。在

这个解决方案有点像黑客,因为它使用threadlocal来获取配置。在

B) 惰性模块全局参数

我个人解决问题的方法更简单(而且可能不是线程安全的):

# In module MailerHolder:
class Holder(object):
    mailer = None

holder = Holder()

def get_emailer():
    return holder.mailer

#In module ConsoleMailer:
import MailHolder

class ConsoleMailer(object):
    def send(self, **kwargs):
    # Code to print email to console

def includeme(config):
    MailHolder.holder.mailer = ConsoleMailer()

你提到芹菜改变了一切。。。Celery并不是很明显,但Celery worker是一个完全独立的进程,它对金字塔应用程序一无所知,可能运行在另一台机器上,在web应用程序创建任务数小时后执行任务—工作人员只是从队列中一个接一个地执行任务。没有从.ini文件组装应用程序的请求、配置程序、WSGI堆栈和PasteDeploy。在

关键是——除非你明确地告诉你,否则芹菜工人不知道你的金字塔过程是在开发还是生产配置中开始的。甚至可以让一个工人从两个应用程序执行任务,一个在开发模式下运行,另一个在生产模式下运行:)

一种选择是在启动时显式地将配置传递给celery worker(例如,通过在芹菜配置.py). 然后,一个工作人员将始终使用同一个邮件程序来完成所有任务。在

另一个选择是将“mailer_type”参数从金字塔应用程序显式地传递给每个任务的工作者:

@task
def send_email(sender, recipient, subject, contents, mailer_type='dummy'):
    emailer = get_emailer(mailer_type)
    emailer.send(from=sender, to=receipient, subject=subject, body=contents)

在金字塔应用程序中,您可以将任何键/值对放入.ini文件中,并通过request.registry.settings访问它们:

^{pr2}$

相关问题 更多 >

    热门问题