我正在尝试在 Heroku 上将自定义 django 命令作为计划任务运行。 我可以通过以下方式在本地执行自定义命令:
python manage.py send_daily_email
。 (注意:我对自定义管理命令本身没有任何问题)
但是,当我尝试通过 Heroku Scheduler 插件“运行”任务时,Heroku 给出了以下异常:
Traceback (most recent call last):
File "bin/send_daily_visit_email.py", line 2, in <module>
from django.conf import settings
ImportError: No module named django.conf
我在/bin/send_daily_email.py中放置了一个python脚本,如下:
#! /usr/bin/python
from django.conf import settings
settings.configure()
from django.core import management
management.call_command('send_daily_email') #delegates off to custom command
但是,在 Heroku 中,我可以运行
heroku run bin/python
- 启动 python shell - 并成功从 settings
导入
django.conf
我很确定这与我的
PYTHON_PATH
或 Django 的 SETTINGS_MODULE
的可见性有关,但我不确定如何解决这个问题。 有人能指出我正确的方向吗? 有没有更简单的方法来完成我在这里想做的事情?
非常感谢您提前提供的提示和建议! Heroku 新手! :)
编辑:
根据 Nix 的评论,我做了一些调整,并且确实发现指定我的确切 python 路径,我确实通过了 Django 设置。
我现在收到:
File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 155, in call_command
raise CommandError("Unknown command: %r" % name)
django.core.management.base.CommandError: Unknown command: 'send_daily_email'
尽管如此,当我运行``heroku run bin/python app/manage.py```时,我可以看到'send_daily_email'。
如果我找到答案,我会及时更新。
您可能正在使用不同的口译员。
检查以确保 shell python 与您在脚本 /usr/bin/python 中引用的相同。 您的路径中可能有一个不同的路径,这可以解释为什么它在您运行
python manage.py
而不是您明确引用的 shell 脚本时起作用 /usr/bin/python
。
输入
which python
将告诉您在您的路径上找到了哪个解释器。
此外,也可以通过将你的主目录添加到你的Python路径来解决这个问题。实现此目的的一种快速且不显眼的方法是将其添加到 PYTHONPATH 环境变量(通常是 Heroku Cedar 堆栈上的 /app )。
通过heroku config命令添加它:
$ heroku config:add PYTHONPATH=/app
应该可以了!有关更多详细信息:http://tomatohater.com/2012/01/17/custom-django-management-commands-on-heroku/
我做了这里所说的所有事情,但后来我意识到,由于某种奇怪的原因,我的应用程序文件夹中根本没有
myapp/apps.py
!
(注意:我的命令不在我的项目的默认应用程序内)!
不知道在此之前一切是如何运作得如此顺利,但无论如何......
尝试了这里提到的所有其他事情后:
创建
apps.py
至 myapp/
from django.apps import AppConfig
class MyAppConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'myapp'
将配置添加到 Djangos INSTALLED_APPS 中
settings.py
(在主应用程序文件夹中)
INSTALLED_APPS = [
'myapp.apps.MyAppConfig',
...
]
向 Heroku 发布新版本并运行命令