3

我正在使用 django-crontab 并且以下 cron 作业运行良好:

以下 cron 作业由

python manage.py crontab 添加

设置.py

CRONTAB_COMMAND_SUFFIX = '2>&1'
CRONJOBS = [
    ('*/1 * * * *', 'my_app.cron.test','>> ~/cron_job.log'),
]

我的应用程序/cron.py

from datetime import datetime
def test():
    print('HELLO : {}'.format(datetime.now()))

一旦服务器运行,它就会打印到日志文件中:

~/cron_job.log

>...
>HELLO : 2018-01-04 23:52:02.983604
>...

如果我想为我的所有模型添加查询,同样的事情:

我的应用程序/cron.py

from datetime import datetime
from django.apps import apps
def test():
    print('HELLO : {}'.format(datetime.now()))
    print(apps.get_models())

~/cron_job.log

>...
>HELLO : 2018-01-05 10:00:02.283938
[<class 'django.contrib.admin.models.LogEntry'>, <class 'django.contrib.auth.models.Permission'>, <class 'django.contrib.auth.models.Group'>, <class 'django.contrib.auth.models.User'>, <class 'django.contrib.contenttypes.models.ContentType'>, <class 'django.contrib.sessions.models.Session'>, <class 'my_app.models.UserProfile'>, <class 'my_app.models.Post'>, <class 'my_app.models.Comment'>, ...]
>...

但是当我开始查询我的模型条目时:

我的应用程序/cron.py

from datetime import datetime
import blog_app.models
def test():
    print('HELLO : {}'.format(datetime.now()))
    for post in my_app.models.Post.objects.all():
        print(post.title)

什么都没有打印出来。模型条目虽然存在。有什么想法吗?

>...
>django.db.utils.OperationalError: no such table: blog_app_post
4

1 回答 1

0

我今天整天都在为此苦苦挣扎,对我来说,问题是 Django 没有通过 cron 连接到数据库,所以它默认为未迁移的 sqlite 数据库。这样做的原因是 cron 设置了一个简约的环境,并且不会读取您可能已经设置的环境变量。大多数使用 Django 的人会根据环境变量有条件地设置他们的数据库。

我通过让 cron 访问我需要的“DATABASE_URL”环境变量解决了这个问题。我发现了两种方法。一种方法是将所需的环境变量导出到全局 /etc/environment 文件:

env | grep DATABASE_URL >> /etc/environment

您可以从 entrypoint.sh 脚本中执行此操作。我自己试过了,它对我有用。

我发现的另一个解决方案似乎有点复杂。它在这里描述:https ://roboslang.blog/post/2017-12-06-cron-docker/ 。我还没有尝试过,但它看起来应该可以工作。

于 2021-01-20T22:00:44.823 回答