Как использовать Last-Modified заголовок с ViewSet Django Rest Framework?

Вот трюк: подкласс ObjectOutputStream и переопределить метод writeStreamHeader:

public class AppendingObjectOutputStream extends ObjectOutputStream {

  public AppendingObjectOutputStream(OutputStream out) throws IOException {
    super(out);
  }

  @Override
  protected void writeStreamHeader() throws IOException {
    // do not write a header, but reset:
    // this line added after another question
    // showed a problem with the original
    reset();
  }

}

Чтобы использовать его, просто проверьте, существует ли файл истории или нет, и создайте экземпляр этого добавочного потока (в если файл существует = мы append = нам не нужен заголовок) или исходный поток (в случае, если файл не существует = нам нужен заголовок).

Изменить

Я был недоволен первым наименованием класса. Это лучше: он описывает «что это такое», а не «как это сделано»

Edit

Изменено имя еще раз, чтобы уточнить, что этот поток предназначен только для добавление к существующему файлу. Он не может быть использован для создания файла new с данными объекта.

Редактировать

Добавлен вызов reset() после этого вопроса показал, что исходная версия, которая просто переопределила writeStreamHeader как no-op, в некоторых случаях могла создать поток, который не мог быть прочитан.

0
задан jozo 18 March 2019 в 12:26
поделиться

2 ответа

@jozo,

Вы можете проверить приложение https://github.com/jatir/django-rest-framework-last-modified django, чтобы использовать Last-Modified [ 113]

Редактировать:

вы можете проверить пример в каталоге тестов https://github.com/jatir/django-rest-framework-last-modified/blob/master/tests /views.py#L14

0
ответ дан Makarand Bauskar 18 March 2019 в 12:26
поделиться

Я проверил пакет, упомянутый @Makarand Bauskar. Однако я не был удовлетворен. Он не активен и использует собственный способ работы / работы с заголовком Last-Modified. Поэтому я решил создать новый пакет django-rest-framework-condition , который будет:

  1. Повторно использовать реализацию из Django
    • , он получит исправления от Django
    • Вы можете использовать его так же, как описано в документах Джанго
  2. . Предоставить @last_modified и @etag decorator
[ 1110] Для его установки:

pip install django-rest-framework-condition

Использование:

from django.contrib.auth import get_user_model
from rest_framework.viewsets import ViewSet
from rest_framework.response import Response
from rest_framework_condition import last_modified


def my_last_modified(request, *args, **kwargs):
    return datetime(2019, 1, 1)


class SubscriptionViewSet(ViewSet):
    @last_modified(my_last_modified)
    def list(self, request):
        data = {'user_count': get_user_model().objects.count()}
        return Response(data)
0
ответ дан jozo 18 March 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: