Django поток словаря несколько раз без нарушения JSON

Я хочу отправить ответ с помощью Django. Для этого У меня такое мнение:

def flights(request, query): req_obj = Flights.RequestObject(query) return StreamingHttpResponse(req_obj.make_response(), content_type = "application/json")

Для создания данных для потока у меня есть функция генератора make_response, который является методом класса «Полеты», созданным как «req_obj».

Функция генератора в определенные моменты выдает чистый словарь Python.

def make_response(self):
   for _ in range(0,3):
      yield some_dict
      time.sleep(1)

Это приводит к следующему поведению:

  • после первого yield возвращается json-контент;
  • после второго (и последующих) выходов возвращаемое содержимое json НЕ является действительным;

если возвращенный словарь выглядит примерно так

{"data": "some_data"}

, после второго yield пользователь получает следующий ответ:

{"data": "some_data"}{"data": "some_data"}

, что НЕ является допустимым json.

Есть предложения, как решить эту проблему?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
425
1

Ответы 1

Вы пробовали что-то вроде

req_obj.update(req_obj.make_response())

который обновит ваш исходный dict значениями, полученными из вашего метода?

Привет, прежде всего, хочу поблагодарить вас за вашу помощь. К сожалению, я не понял вашего ответа.

Rafael Marques 22.05.2018 17:02

Я предполагаю, что это обновление произойдет в первом аргументе streamingHttpResponse, к сожалению, это не работает, потому что req_obj.make_response () не является объектом, а скорее генератором. @Omar

Rafael Marques 22.05.2018 17:06

Ах да, правильно @RafaelMarques, так как насчет внутри генератора вы делаете: yield self.update (some_dict) Я не уверен, как вы строите dict из объекта Flight, но поскольку у вас есть доступ к нему в make_response вы, возможно, можете использовать это для обновления словаря, который выдается

Omar 22.05.2018 17:22

проблема не в этом. Проблема в том, что если несколько раз получить словарь (равный или разный), получается что-то, что НЕ является словарем. @Omar

Rafael Marques 22.05.2018 17:23

правильно, поэтому в вашем вопросе он возвращал два словаря, поэтому обновление объединит значения в один словарь

Omar 22.05.2018 17:26

Мое плохое, я думаю, что я неправильно понимаю все это, поток приводит к "двойному" словарю, не уверен, что вы справитесь с этой стороной django

Omar 22.05.2018 17:28

точно. хотя обновление работает так, как вы говорите, Stream и Yield приводят к возврату нескольких словарей, которые в совокупности образуют объект, который не является допустимым json или даже dict в этом отношении.

Rafael Marques 22.05.2018 17:30

@RafaelMarques, тебе удалось это решить? Если да, то какую технику вы использовали? Вы пытались выполнить потоковую передачу строкового объекта и проанализировать его как json на другом конце?

Omar 08.04.2019 19:07

Нет, мне не удалось решить мою ситуацию со стримингом. Я хотел постепенно возвращать ответы (вернуть ответ A сейчас, вернуть ответ B через секунду, ответ C позже и т. д.). Насколько я могу судить, потоковая передача не подходила для этого, поскольку потоковая передача использовалась для отправки уже существующего ответа, фрагмент за фрагментом, вместо того, чтобы возвращать несколько объектов ответа, когда они становятся доступными. Честно говоря, я до сих пор не знаю, как решить эту проблему, хе-хе @omar

Rafael Marques 26.04.2019 16:42

Другие вопросы по теме