Приложения Django еще не загружены — не удается импортировать модель

#django #django-celery

#django #django-сельдерей

Вопрос:

Я не могу импортировать свою модель в мой celery.py файл, поэтому я использую его в запланированной задаче — я всегда получаю django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

Я рву на себе волосы — несколько человек, похоже, получили ту же ошибку, но ни в тех же обстоятельствах, и я перепробовал все исправления, и ничего не работает.

Мой celery.py файл в моем основном приложении Django:

 from __future__ import absolute_import, unicode_literals

import requests
import os
from celery import Celery

from WeatherData.models import LondonWeather

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Weather.settings')
from .settings import OPEN_WEATHER_API_KEY, OPEN_WEATHER_API_URL
# set the default Django settings module for the 'celery' program.


app = Celery('Weather')

app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Gets London weather every hour.

    sender.add_periodic_task(10.0, get_weather_task.s(), name='london_weather_test')
    sender.add_periodic_task(3600.0, get_weather_task.s(), name='london_weather')


@app.task()
def get_weather_task():

    querystring = {"q": "London,UK"}

    headers = {
        'x-api-key': OPEN_WEATHER_API_KEY,
    }

    res = requests.get(OPEN_WEATHER_API_URL, headers=headers, params=querystring).json()

    LondonWeather.objects.create(
            longitude=res.get('coord', 0).get('lon', 0),
            latitude=res.get('coord', 0).get('lat', 0),
            main_weather=res.get('weather', {})[0].get('main', 'Rain'),
            description=res.get('weather', {})[0].get('description', 'No data'),
            temperature=res.get('main', {}).get('temp', 0),
            pressure=res.get('main', {}).get('pressure', 0),
            humidity=res.get('main', {}).get('humidity', 0),
            min_temp=res.get('main', {}).get('temp_min', 0),
            max_temp=res.get('main', {}).get('temp_max', 0),
            wind_speed=res.get('wind', {}).get('speed', 0),
            wind_direction=res.get('wind', {}).get('deg', 0),
            clouds=res.get('clouds', {}).get('all', 0),
    )

    return res
  

init.py из моего основного приложения выглядит так из-за clery:

 from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)
  

Это связано с импортом Django?

Комментарии:

1. я не знаю всех деталей, но, похоже, простое решение — это сделать from WeatherData.models import LondonWeather внутри вашей функции get_weather_task

2. Это работает! Почему это имеет какое-то значение?

3. вы получаете рекурсивный импорт python при запуске вашего приложения.