Django StreamingHttpResponse с предупреждением о настройке asgi
Здравствуйте, я использую следующее представление на основе класса для определения конечной точки для возврата большого набора Django Queryset в виде Json или CSV с использованием потокового ответа
class DataView(viewsets.ReadOnlyModelViewSet):
permission_classes = [IsAuthenticated, StrictDjangoModelPermissions]
authentication_classes = [JWTAuthentication]
queryset = Data.objects.all()
serializer_class = DataSerializer
pagination_class = LimitOffsetPagination
filter_backends = (DjangoFilterBackend,SearchFilter)
filterset_class = DataFilter
search_fields = ['^ts']
def generate_data(self, start, end, needCSV, points):
cols = ['ts', 'topic_id', 'value_string']
if len(points) > 0:
data = Data.objects.filter(ts__range=(start, end), topic_id__in=points)
else:
data = Data.objects.filter(ts__range=(start, end))
dis_dict = {point.id: point.navPoint for point in Points.objects.filter(id__in=points)}
if needCSV:
yield ','.join(cols + ['dis']) + '\n'
for row in data:
dis_value = dis_dict.get(row.topic_id, '')
yield ','.join(map(str, [getattr(row, col) for col in cols] + [dis_value])) + '\n'
else:
yield '['
for i, row in enumerate(data):
if i > 0:
yield ','
dis_value = dis_dict.get(row.topic_id, '')
row_dict = {col: str(getattr(row, col)) for col in cols}
row_dict['dis'] = dis_value
yield json.dumps(row_dict)
yield ']'
def list(self, request, *args, **kwargs):
try:
csv = request.GET.get('csv', False)
csv = csv and csv.lower() == 'true'
points = request.GET.getlist('point', [])
start = request.GET['start']
end = request.GET['end']
contentType = 'text/csv' if csv else 'application/json'
fileName = 'data.csv' if csv else 'data.json'
response = StreamingHttpResponse(self.generate_data(start, end, csv, points), content_type=contentType)
response['Content-Disposition'] = f'attachment; filename="{fileName}"'
return response
except Exception as e:
return Response({ "status": False, "message": str(e) })
Код отлично работает, когда я тестирую его с помощью команды py manage.py runserver
Но когда я запускаю это в производстве, используя uvicorn project.asgi:application --port 8000
Выдает следующее предупреждение
C:\Users\Zain ul abdin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\http\response.py:517: Warning: StreamingHttpResponse must consume synchronous iterators in order to serve them asynchronously. Use an asynchronous iterator instead.
warnings.warn(
Обратите внимание на то, что при использовании runserver ответ действительно транслируется, строка за строкой, но при использовании uvicorn он внезапно возвращает весь ответ, например, yield не работает должным образом.
Я использую Django 5, и мой вопрос прост - как я могу избавиться от предупреждения?
Шаги, которые я уже предпринял, чтобы решить проблему, но не смог
- Преобразовали функцию generate_data из sync в async (Ошибка)
- Преобразовали функцию def list() в async (Ошибка)
- Попытались использовать служебную функцию sync_to_async (Ошибка)