New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
django-crontab can't access environment variables used in settings.py #88
Comments
Figured out how to inform the crontab of environment variables. Pointed it to the .bash_profile where they are set. CRONJOBS = [ Works great |
Have a look at the README.There's an example for the setting |
I glossed over that. Thanks. Great project! |
I solved it editing the crontab, add this at first line:
And change the line created by crontab library with the command:
|
Yeah, it seems like I have to add that line |
If use in docker or k8s, SHELL=/bin/bash can not work, my solution is this:
export > /opt/env
CRONJOBS = [
('*/5 * * * * (source /opt/env || true) &&', 'app.crontab.crontab')
] |
None of the above worked for me, but it pointed me in the right direction. carestad's answer in this link was what did the trick for me basically, the crontab doesn't have the env variables in scope, so to do that, we can output our in my entrypoint.sh:
then in the settings.py
|
@kraiz is right, you can use the
This is working, given the environment variables were not modified/added during runtime. |
If you are using Ubuntu >=18.0, try with following changes. DB_NAME = "" */1 * * * * /home/sms/sms/env/bin/python /home/sms/sms/sms-backend/website/manage.py crontab run 446aeeebac8c8f82d9e01bb662dc9b21 >> /tmp/scheduled_job.log # django> Nota Bene: For me, I have 4 variables, Add all your environment variables as it is mentioned and replace all asterisk alpahbet with your information. |
For docker/k8s case:
printenv > /app_folder/.env
pip install python-dotenv
from pathlib import Path
import os
from dotenv import dotenv_values
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
ENV_FILE=str(Path(BASE_DIR)) + '/.env'
myvars=dotenv_values(ENV_FILE)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': myvars['POSTGRES_NAME'],
'USER': myvars['POSTGRES_USER'],
'PASSWORD': myvars['POSTGRES_PASSWORD'],
'HOST': myvars['POSTGRES_HOST'],
'PORT': 5432,
}
}
|
Had a similar issue with a project but of course i figured it out just about the environment variables you just need to add the CRONTAB_COMMAND_PREFIX before the list of your crontabs. OK basically that tells crontab where to find the environment it needs to work with ie:
|
Solved. Thank you very much for your reply.
…On Tue, 20 Sep 2022, 7:13 pm Ayume Francis, ***@***.***> wrote:
Had a similar issue with a project but of course i figured it out just
about the environment variables you just need to add the
CRONTAB_COMMAND_PREFIX before the list of your crontabs. OK basically that
tells crontab where to find the environment it needs to work with ie:
`CRONTAB_COMMAND_PREFIX = (
'STAGE={whether production or development}'
)
CRONJOBS = [
('* * * * *', '{your crontab view}'),
]`
—
Reply to this email directly, view it on GitHub
<#88 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AKECZZLT7HWOBDVVQ5YEVMTV7GZ7XANCNFSM4FPCXTDA>
.
You are receiving this because you commented.Message ID:
***@***.***>
|
This a good approach and working solution for more complex variables. In my case, I don't use docker but I needed to pass the database configurations, which happens to work unexpectedly using the default approach of CRONTAB_COMMAND_PREFIX. This approach worked for me |
Environment & Versions
Settings
django-crontab
settings:Details
crontab -l
after runningpython manage.py crontab add
.crontab run
command and I copy this command to my terminal the job works: yes/nono
The traceback is below. The issue is that crontab doesn't recognize the os.environ variables i use in settings.py for db connections, aws secret keys, etc. I don't know how to make these available to a cron job and hoped that django-crontab would have a baked-in solution.
The same function works fine when I am running it from the django project itself.
Thanks!
Message 18:
From billburton@Jimmys-iMac.local Fri Aug 10 15:05:00 2018
X-Original-To: billburton
Delivered-To: billburton@Jimmys-iMac.local
From: billburton@Jimmys-iMac.local (Cron Daemon)
To: billburton@Jimmys-iMac.local
Subject: Cron billburton@Jimmys-iMac /Users/billburton/Projects/djangodigital/dpmvenv/bin/python /Users/billburton/Projects/djangodigital/manage.py crontab run 79da9099e73f903adeec54d63e2acd67 # django-cronjobs for djangodigital
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=billburton>
X-Cron-Env: <USER=billburton>
X-Cron-Env: <HOME=/Users/billburton>
Date: Fri, 10 Aug 2018 15:05:00 -0400 (EDT)
Traceback (most recent call last):
File "/Users/billburton/Projects/djangodigital/manage.py", line 22, in
execute_from_command_line(sys.argv)
File "/Users/billburton/Projects/djangodigital/dpmvenv/lib/python3.6/site-packages/django/core/management/init.py", line 371, in execute_from_command_line
utility.execute()
File "/Users/billburton/Projects/djangodigital/dpmvenv/lib/python3.6/site-packages/django/core/management/init.py", line 317, in execute
settings.INSTALLED_APPS
File "/Users/billburton/Projects/djangodigital/dpmvenv/lib/python3.6/site-packages/django/conf/init.py", line 56, in getattr
self._setup(name)
File "/Users/billburton/Projects/djangodigital/dpmvenv/lib/python3.6/site-packages/django/conf/init.py", line 43, in _setup
self._wrapped = Settings(settings_module)
File "/Users/billburton/Projects/djangodigital/dpmvenv/lib/python3.6/site-packages/django/conf/init.py", line 106, in init
mod = importlib.import_module(self.SETTINGS_MODULE)
File "/Users/billburton/Projects/djangodigital/dpmvenv/lib/python3.6/importlib/init.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 994, in _gcd_import
File "", line 971, in _find_and_load
File "", line 955, in _find_and_load_unlocked
File "", line 665, in _load_unlocked
File "", line 678, in exec_module
File "", line 219, in _call_with_frames_removed
File "/Users/billburton/Projects/djangodigital/djangodigital/settings.py", line 94, in
'HOST': os.environ['RDS_DPM_MAIN_HOSTNAME'],
File "/Users/billburton/Projects/djangodigital/dpmvenv/bin/../lib/python3.6/os.py", line 669, in getitem
raise KeyError(key) from None
KeyError: 'RDS_DPM_MAIN_HOSTNAME'
The text was updated successfully, but these errors were encountered: