Как использовать StreamingHttpResponse в django rest framework?
У меня есть простой django rest framework и я хочу знать, как можно использовать StreamingHttpResponse в моем проекте.
Моя модель выглядит следующим образом:
class Article(models.Model):
user = models.CharField(max_length=100)
title = models.CharField(max_length=200)
description = models.TextField()
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
а сериализатор для этой модели выглядит так:
class ArticleSerializers(serializers.ModelSerializer):
class Meta:
model = Article
fields = ['id', 'user', 'title', 'description', 'date']
Я думаю, что моя проблема в mu view или url. поэтому я написал код в view следующим образом:
class StreamPost(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializers
def get_queryset(self):
stream = event_stream()
response = StreamingHttpResponse(stream, status=200, content_type='text/event-stream')
response['Cache-Control'] = 'no-cache'
return response
что поток событий выглядит следующим образом:
def event_stream():
initial_data = ''
while True:
list_article = list(Article.objects.all())
data = json.dumps(list_article, cls=DjangoJSONEncoder)
if not initial_data == data:
yield "\ndata: {}\n\n".format(data)
initial_data = data
time.sleep(1)
url выглядит следующим образом:
router = DefaultRouter()
router.register('stream', StreamPost, basename='stream')
urlpatterns = [
path('', include(router.urls)),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Я не могу отследить ошибку и поэтому не знаю, где моя проблема, но когда запускаю свой проект с этим кодом, проблема выглядит так:
Object of type Article is not JSON serializable
Когда я изменил функцию event_stream, ошибка изменилась следующим образом:
def event_stream():
initial_data = ''
while True:
list_article = list(Article.objects.all().values('id', 'user', 'title', 'description', 'date'))
data = json.dumps(list_article, cls=DjangoJSONEncoder)
if not initial_data == data:
yield "\ndata: {}\n\n".format(data)
initial_data = data
time.sleep(1)
ошибка:
Got AttributeError when attempting to get a value for field `user` on serializer `ArticleSerializers`.
The serializer field might be named incorrectly and not match any attribute or key on the `bytes` instance.
Original exception text was: 'bytes' object has no attribute 'user'.