Представление Django, возвращающее устаревшие данные, исправлено после перезапуска сервера - PullRequest
0 голосов
/ 27 июня 2018

У меня есть веб-сервер Django с базой данных postgresql.

У меня есть представление (структура Django REST), которое демонстрирует странное поведение.

В представлении указывается дата самой последней записи в таблице. Записи последовательно добавляются несколько раз в минуту в эту таблицу. В этом представлении не реализовано кэширование.

Сегодня я заметил следующее:

  • представление на рабочем сервере возвращало устаревшие данные (последние данные 2 дня назад)
  • просмотр на локальном сервере разработки (подключается к той же удаленной базе данных) вернул свежие данные
  • просмотр в ./manage.py shell запуск на рабочем сервере возвратил свежие данные
  • Я не перезагружал производственный сервер 2 дня назад
  • После перезагрузки производственного сервера сегодня данные снова обновляются
  • 30 минут спустя, данные устарели на 30 минут

Что может быть причиной этого? Почему мне пришлось обновить соединение с базой данных, чтобы получить свежие данные?

Соответствующий код:

# models.py
class MyModel(models.Model):
    name = models.CharField(max_length=255)

    def get_data(self,
            start_date=timezone.now()-timedelta(hours=24),
            end_date=timezone.now()):
        latest_data = self.data.filter(date__gte=start_date, date__lte=end_date).latest('date')
        return {
            'latest': latest_data.date
        }


class MyOtherModel(models.Model):
    date = models.DateTimeField()
    foreign_key = models.ForeignKey(MyModel, related_name='data')


# views.py
class MyView(generics.ListAPIView):
    serializer_class = MySerializer
    def get_queryset(self):
        queryset = MyModel.objects.all()


# serializers.py
class MySerializer(serializers.ModelSerializer):
    data = serializers.DictField(source="get_data")

    class Meta:
        model = MyModel
        fields = ('data',)

Метод get_data возвращает устаревшие данные при вызове в сериализаторе представлений от рабочих-оружейников. Данные устарели на дату запуска рабочих.

Метод get_data не возвращает устаревшие данные при вызове из нового рабочего процесса или нового экземпляра оболочки.

1 Ответ

0 голосов
/ 27 июня 2018

Нашел проблему. Я получаю данные для временного диапазона, и этот временной диапазон устанавливается в параметрах метода по умолчанию.

Параметры по умолчанию в Python оцениваются один раз при объявлении метода.

Мне нужно было изменить:

def get_data(self,
        start_date=timezone.now()-timedelta(hours=24),
        end_date=timezone.now()):
    latest_data = self.data.filter(date__gte=start_date, date__lte=end_date).latest('date')
    return {
        'latest': latest_data.date
    }

Кому:

def get_data(self, start_date=None, end_date=None):
    if start_date is None:
        start_date = timezone.now()-timedelta(hours=24)
    if end_date is None:
        end_date = timezone.now()

    latest_data = self.data.filter(date__gte=start_date, date__lte=end_date).latest('date')
    return {
        'latest': latest_data.date
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...