Python 应用服务器+邮件服务器上的DJANGO芹菜
我正在尝试在应用服务器上用单独的邮件服务器配置DJANGO+芹菜 两台服务器具有相同的文件: app_name/settings.pyPython 应用服务器+邮件服务器上的DJANGO芹菜,python,django,celery,django-celery,celery-task,Python,Django,Celery,Django Celery,Celery Task,我正在尝试在应用服务器上用单独的邮件服务器配置DJANGO+芹菜 两台服务器具有相同的文件: app_name/settings.py BROKER_URL = "sqs://%s:%s@" % (AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) CELERY_TIMEZONE = 'America/New_York' CELERY_ACCEPT_CONTENT = ['pickle','json', 'msgpack', 'yaml'] from celery.
BROKER_URL = "sqs://%s:%s@" % (AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)
CELERY_TIMEZONE = 'America/New_York'
CELERY_ACCEPT_CONTENT = ['pickle','json', 'msgpack', 'yaml']
from celery.schedules import crontab
from datetime import timedelta
CELERY_ROUTES = {
'mail.tasks.send_reminder_email_end_user': {'queue': 'scheduler'},
'mail.tasks.send_all_daily_new_user_email': {'queue': 'scheduler'},
'mail.tasks.send_notification_email': {'queue': 'scheduler'},
'mail.tasks.send_new_post_daily_email': {'queue': 'scheduler'},
'insightStat.tasks.save_stats_history_daily': {'queue': 'scheduler'},
}
CELERY_DISABLE_RATE_LIMITS = True
CELERYBEAT_SCHEDULE = {
'send_reminder_email_daily': {
'task': 'mail.tasks.send_reminder_email_end_user',
'schedule': crontab(minute= 0,hour=7)
},
'update_stats_history_daily': {
'task': 'insightStat.tasks.save_stats_history_daily',
'schedule': crontab(minute= 0,hour=1)
},
'send_notification_email_weekly': {
'task': 'mail.tasks.send_notification_email',
'schedule': crontab(minute= 0,hour=8)
},
'send_digest_email_daily': {
'task': 'mail.tasks.send_new_post_daily_email',
'schedule': crontab(minute= 0,hour=8)
},
'send_daily_new_users': {
'task': 'mail.tasks.send_all_daily_new_user_email',
'schedule': crontab(minute= 0,hour=7)
},
'send_digest_email_weekly': {
'task': 'mail.tasks.send_weekly_digest',
'schedule': crontab(minute= 0,hour=8,day_of_week='Mon')
},
}
mail/tasks.py文件:
@shared_task(queue='scheduler')
def send_all_daily_new_user_email():
apps = Application.objects.all()
for app in apps:
daily_new_user_email.delay(app)
@shared_task(queue='daily_user')
def daily_new_user_email(app):
print "sending daily_new_user_email"
if not app.digest_email:
print "app digest is off, return"
return
if not app.owner.all():
return
yesterday = date.today() - timedelta(days=1)
users= app.appuser.filter(created_at__gt=yesterday)
users_count = users.count()
owner = app.owner.all()[0]
if users_count == 0:
print "no new users for %s " % owner.email
return
recent_user = users[0]
subject = "%s new subscribers" % str(users_count)
content_html = render_to_string('daily_new_users.html',locals())
email = owner.email
print sendEmail(NOTIFICATION_EMAIL,email,subject,content_html,content_html,'daily_new_users')
app_name/cellery_task.py文件包含:
app = Celery('app_name', backend='', broker='"sqs://%s:%s@" % (AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)',
include=['mail.tasks'])
if __name__ == '__main__':
app.start()
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
其中:scheduler是应用服务器上的Que,daily_用户是邮件服务器上的Que。我正在利用主管开始芹菜工人
这将多次向用户发送邮件。我做错了什么
另外,有人能简要介绍一下@shared_task吗?它每次运行发送电子邮件的次数是多少?你能确认你只定义了一个应用程序吗?您是否检查过您的任务是否被多次调用,以及电子邮件任务本身是否被多次处理?