Вот трюк: подкласс 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, в некоторых случаях могла создать поток, который не мог быть прочитан.
@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
Я проверил пакет, упомянутый @Makarand Bauskar. Однако я не был удовлетворен. Он не активен и использует собственный способ работы / работы с заголовком Last-Modified. Поэтому я решил создать новый пакет django-rest-framework-condition , который будет:
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)