我正在用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
的内容?在
自从一个月前提出这个问题以来,我已经读了一点书。这让我找到了两种可能的解决方案:
A) 惯用金字塔
我们要解决两个问题:
要设置指定的类,我们应该在模块中定义一个
includeme()
函数,然后在.ini文件中指定该模块作为pyramid.includes
的一部分。在我们的includeme()
函数中,我们使用config.registry.registerUtility()
,它是{a1}的一部分,注册我们的类和它实现的interface。在为了在运行时访问我们的类,我们需要调用}。在
registry.queryUtility()
,从pyramid.threadlocal.get_current_registry()
获取{这个解决方案有点像黑客,因为它使用
threadlocal
来获取配置。在B) 惰性模块全局参数
我个人解决问题的方法更简单(而且可能不是线程安全的):
你提到芹菜改变了一切。。。Celery并不是很明显,但Celery worker是一个完全独立的进程,它对金字塔应用程序一无所知,可能运行在另一台机器上,在web应用程序创建任务数小时后执行任务—工作人员只是从队列中一个接一个地执行任务。没有从
.ini
文件组装应用程序的请求、配置程序、WSGI堆栈和PasteDeploy。在关键是——除非你明确地告诉你,否则芹菜工人不知道你的金字塔过程是在开发还是生产配置中开始的。甚至可以让一个工人从两个应用程序执行任务,一个在开发模式下运行,另一个在生产模式下运行:)
一种选择是在启动时显式地将配置传递给celery worker(例如,通过在芹菜配置.py). 然后,一个工作人员将始终使用同一个邮件程序来完成所有任务。在
另一个选择是将“mailer_type”参数从金字塔应用程序显式地传递给每个任务的工作者:
在金字塔应用程序中,您可以将任何键/值对放入
^{pr2}$.ini
文件中,并通过request.registry.settings
访问它们:相关问题 更多 >
编程相关推荐