我通过cron运行的Django管理命令有一个奇怪的问题。
我已将生产服务器设置为使用Mailgun。我有一个仅发送电子邮件的管理命令:
from django.core.mail import send_mail
class Command(BaseCommand):
help = 'Send email'
def handle(self, *args, **options):
send_mail('Test email', 'Test content', 'noreply@example.com', ['me@example.com',], fail_silently=False)
如果我通过命令行运行它(我正在使用virtualenvwrapper),则此脚本可以完美地工作:
> workon myapp
> python manage.py do_command
或直接:
> /home/user/.venvs/project/bin/python /home/user/project/manage.py do_command
但是当我使用cron(crontab -e
)进行设置时:
*/1 * * * * /home/user/.venvs/project/bin/python /home/user/project/manage.py do_command
脚本运行(无错误),但未发送电子邮件。
怎么回事?
答案 0 :(得分:0)
好的,问题是设置了错误的DJANGO_SETTINGS_MODULE
环境变量,并且有几件事使我不喜欢这种气味:
我的manage.py
脚本默认为我的设置的“开发”版本:settings.local
,它使用命令行电子邮件后端。 Cron抑制了所有输出,所以我没有看到这种情况。
第二,我正在将DJANGO_SETTINGS_MODULE
设置为settings.production
的外壳中进行测试,因此当我在命令行上运行脚本时,脚本似乎可以正确运行。
修复很容易,将DJANGO_SETTINGS_MODULE
添加到crontab:
DJANGO_SETTINGS_MODULE=config.settings.production
*/1 * * * * ...