在 Heroku 上运行 Django 自定义 manage.py 任务 - 导入问题

问题描述 投票:0回答:3

我正在尝试在 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'。

如果我找到答案,我会及时更新。

python django heroku django-settings manage.py
3个回答
4
投票

您可能正在使用不同的口译员。

检查以确保 shell python 与您在脚本 /usr/bin/python 中引用的相同。 您的路径中可能有一个不同的路径,这可以解释为什么它在您运行

python manage.py
而不是您明确引用的 shell 脚本时起作用
/usr/bin/python


输入

which python
将告诉您在您的路径上找到了哪个解释器。


2
投票

此外,也可以通过将你的主目录添加到你的Python路径来解决这个问题。实现此目的的一种快速且不显眼的方法是将其添加到 PYTHONPATH 环境变量(通常是 Heroku Cedar 堆栈上的 /app )。

通过heroku config命令添加它:

$ heroku config:add PYTHONPATH=/app

应该可以了!有关更多详细信息:http://tomatohater.com/2012/01/17/custom-django-management-commands-on-heroku/


0
投票

我做了这里所说的所有事情,但后来我意识到,由于某种奇怪的原因,我的应用程序文件夹中根本没有

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 发布新版本并运行命令

© www.soinside.com 2019 - 2024. All rights reserved.