【问题标题】:Django: Load production settings for celeryDjango:加载芹菜的生产设置
【发布时间】:2018-05-14 18:21:32
【问题描述】:

我的 Django 项目有多个用于开发、生产和测试的设置文件。我正在使用主管来管理芹菜工人。我的问题是如何根据我所处的环境加载 celery 的设置文件。

【问题讨论】:

    标签: django celery


    【解决方案1】:

    通过使用环境变量。假设您在存储库的根目录中有以下设置文件。

    • config.settings.development.py
    • config.settings.production.py
    • ...

    The recommended way 定义您的 celery 实例在您的配置中,例如 celery.py 模块:

    from __future__ import absolute_import, unicode_literals
    import os
    from celery import Celery
    
    # set the default Django settings module for the 'celery' program.
    # os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.production')
    
    app = Celery('proj')
    
    # Using a string here means the worker doesn't have to serialize
    # the configuration object to child processes.
    # - namespace='CELERY' means all celery-related configuration keys
    #   should have a `CELERY_` prefix.
    app.config_from_object('django.conf:settings', namespace='CELERY')
    
    # Load task modules from all registered Django app configs.
    app.autodiscover_tasks()
    
    
    @app.task(bind=True)
    def debug_task(self):
        print('Request: {0!r}'.format(self.request))
    

    不要在模块中设置 DJANGO_SETTINGS_MODULE 变量(我已将其注释掉),请确保在启动 supervisord 时环境中存在这些变量。

    要在暂存、测试和生产系统中设置这些变量,您可以执行以下 bash 命令。

    例如在您的生产系统上:

    $ export DJANGO_SETTINGS_MODULE=config.settings.production
    $ echo $DJANGO_SETTINGS_MODULE
    

    我还建议您从.env 文件中加载它们。在我看来那更方便。例如,您可以使用 python-dotenv


    更新

    .env 文件在您的不同系统上大多是唯一的,并且通常不受源代码/版本控制。唯一我的意思是对于开发,您可能有更详细的LOG_LEVEL 或不同的SECRET_KEY,因为您不希望它们出现在您的源代码管理中,或者希望能够在不修改源文件的情况下调整它们。

    因此,在您的 base.pyproduction.pydevelopment.py 正在继承)中,您可以从文件中加载变量,例如:

    import os
    from dotenv import load_dotenv
    load_dotenv()  # .env file has to be in the same directory
    
    # ...
    import os
    DJANGO_SETTINGS_MODULE = os.getenv("DJANGO_SETTINGS_MODULE")
    print(DJANGO_SETTINGS_MODULE)
    # ...
    

    我个人不使用该包,因为我使用docker,它具有定义.env 文件的声明方式,但上面的代码应该让您了解它是如何工作的。有类似的软件包,例如django-environ,这本书在Two Scoops of Django 中有介绍。所以我倾向于使用这个而不是python-dotenv,这是一个口味问题。

    【讨论】:

    • 如果服务器由于某种原因重新启动,那么我认为它不会起作用。我能解释一下.env 文件技术吗?
    【解决方案2】:

    您可能想要配置不同的设置文件。从这里你有两个选择。您可以在运行时使用 django-admin 设置参数

    django-admin runserver --settings=thecelery.settings
    

    此外,您可以选择在 settings.py 中配置设置。如果您当前有 1 个设置文件,这将需要您设置其他设置文件,并在实例上设置环境变量。然后在你的基本设置文件中,你可以这样做

    import os
    
    environment your_env = os.environ["environment"]
    if your_env == "celery":
       os.environ.setdefault("DJANGO_SETTINGS_MODULE", "thecelerysettings")
    else:
       os.environ.setdefault("DJANGO_SETTINGS_MODULE", "defaultsettings")
    

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2019-12-07
      相关资源
      最近更新 更多