My Django полагаются на Celery и Celerybeat для создания заданий. У меня есть 3 системных сервиса / единицы:
- myapp.service (демон gunicorn)
- celery-myapp.service (работник (и) сельдерея)
- celerybeat- myapp.service (демон celerybeat)
У меня есть переменная окружения MY_SECRET, определенная в моей основной службе "myapp.service" (модуль systemd).
Я не могу получить это значение из settings.py или непосредственно из переменной окружения в моих задачах (tasks.py), но я могу плавно получить это значение из моего представления (views.py), используя напрямую settings.py или переменную окружения.
Нужно ли мне реплицировать переменную среды MY_SECRET, определенную в myapp.service, на celery-myapp.service и celerybeat-myapp.service, чтобы я мог получить это значение из своих задач Celery? Как я могу получить значение MY_SECRET i, моя задача Celery?
myapp.service
[Unit]
Description=My App
After=network.target
Wants=celery-myapp.service
Wants=celerybeat-myapp.service
[Service]
User=myapp
Group=nginx
Environment=MY_SECRET=1234
WorkingDirectory=/opt/myproject/
ExecStart=/opt/myproject/env/bin/gunicorn --workers 3 --log-level debug --bind unix://opt/myproject/myapp.sock myaproject.wsgi:application
[Install]
WantedBy=multi-user.target
Переменная окружения указана в моем Django project 'settings.py 'наряду с другими настройками, которые я намеревался использовать в приложении:
settings.py
# Populated with environment variable defined by systemd unit
MY_SECRET = os.environ.get('MY_SECRET')
# Static value
MY_URL= 'http://127.0.0.1'
На мой взгляд, я могу получить значение, определенное как переменная среды MY_SECRET из settings.py и напрямую из окружения:
views.py
def my_view(request):
from django.conf import settings as project_settings
my_secret_env = os.environ.get('MY_SECRET')
my_secret_setting = project_settings.MY_SECRET
my_url_setting = project_settings.MY_URL
return render(request,'mypage.html',{
'my_secret_env': my_secret_env,
'my_secret_setting': my_secret_setting,
'my_url_setting': my_url_setting,
)
mypage. html
{% block page_content %}
<!-- Value displayed properly -->
<p><strong>my_secret_env:</strong> {{ my_secret_env }}</p>
<!-- Value displayed properly -->
<p><strong>my_secret_setting:</strong> {{ my_secret_setting }}</p>
<!-- Value displayed properly -->
<p><strong>my_url_setting:</strong> {{ my_url_setting }}</p>
{% endblock %}
Из моей задачи я не могу получить значение, определенное как переменная окружения MY_SECRET из settings.py, ни напрямую из окружения.
С другой стороны, значение stati c из settings.py правильно извлекается:
tasks.py
@shared_task
def task_mytask():
from django.conf import settings as project_settings
my_secret_env = os.environ.get('MY_SECRET')
my_secret_setting = project_settings.MY_SECRET
my_url_setting = project_settings.MY_URL
# No value displayed
print(my_secret_env)
# No value displayed
print(my_secret_setting)
# Value displayed properly
print(my_url_setting)
@periodic_task(run_every=timedelta(seconds=60))
def task_myperiodictask():
task_mytask.delay()