Как получить значение Dynami c из Django settings.py в задаче Celery? - PullRequest
0 голосов
/ 12 марта 2020

My Django полагаются на Celery и Celerybeat для создания заданий. У меня есть 3 системных сервиса / единицы:

  1. myapp.service (демон gunicorn)
  2. celery-myapp.service (работник (и) сельдерея)
  3. 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()

1 Ответ

0 голосов
/ 12 марта 2020

Не уверен, что ваша цель здесь, но вы никогда не должны разглашать свои секреты. Однако, если вы хотите, вам, возможно, придется передать их как аргументы от того места, где вы вызываете задачу. Вот так:

task.py

@shared_task()
def task_mytask(my_secret_env, my_secret_setting):
    ...

views.py

task_mytask.apply_async(args=[my_secret_env, my_secret_setting])

Также вы можете попробовать установите переменную окружения и попробуйте вызвать ее.

export MY_SETTING = 1234
...