Source code for faust.fixups.django

"""Django Fixups - Integration with Django."""

import os
import typing
import warnings
from typing import Iterable

from mode.utils.imports import symbol_by_name
from mode.utils.objects import cached_property

from . import base

if typing.TYPE_CHECKING:  # pragma: no cover
    from django.apps.registry import Apps as _Apps
    from django.settings import Settings as _Settings
else:

    class _Apps: ...  # noqa

    class _Settings: ...  # noqa


__all__ = ["Fixup"]

WARN_NOT_INSTALLED = """\
Environment variable DJANGO_SETTINGS_MODULE is defined
but Django isn't installed.  Won't apply Django fix-ups!
"""

WARN_DEBUG_ENABLED = """\
Using settings.DEBUG leads to a memory leak, never
use this setting in production environments!
"""


[docs]class Fixup(base.Fixup): """Django fixup. This fixup is enabled if 1) the :envvar:`DJANGO_SETTINGS_MODULE` environment variable is set, 2) the :pypi:`django` package is installed. Once enabled it will modify the following features: - Autodiscovery If ``faust.App(autodiscovery=True)``, the Django fixup will automatically autodiscover agents/tasks/web views, and so on found in installed Django apps. - Setup The Django machinery will be set up when Faust commands are executed. """
[docs] def enabled(self) -> bool: """Return :const:`True` if Django is used in this environment.""" if os.environ.get("DJANGO_SETTINGS_MODULE"): try: import django # noqa except ImportError: warnings.warn(WARN_NOT_INSTALLED, stacklevel=2) else: return True return False
[docs] def wait_for_django(self) -> None: import django django.setup() if self.settings.DEBUG: warnings.warn(WARN_DEBUG_ENABLED, stacklevel=2)
[docs] def autodiscover_modules(self) -> Iterable[str]: """Return list of additional autodiscover modules. For Django we run autodiscovery in all packages listed in the ``INSTALLED_APPS`` setting (with support for custom app configurations). """ self.wait_for_django() return [config.name for config in self.apps.get_app_configs()]
[docs] def on_worker_init(self) -> None: """Initialize Django before worker/CLI command starts.""" from django.core.checks import run_checks self.wait_for_django() run_checks()
[docs] @cached_property def apps(self) -> _Apps: """Return the Django app registry.""" return symbol_by_name("django.apps:apps")
[docs] @cached_property def settings(self) -> _Settings: """Return the Django settings object.""" return symbol_by_name("django.conf:settings")