Заголовок длины содержимого не задан в ответе Flask App Engine для обслуживаемого большого двоичного объекта - PullRequest
0 голосов
/ 26 апреля 2018

На моем сервере Google App Engine на базе Flask я пытаюсь вернуть ответ с заголовком «длина содержимого», который будет содержать окончательный размер большого двоичного объекта, который будет передан клиенту. Этот большой двоичный объект представляет собой большой мультимедийный файл, поэтому этот заголовок будет использоваться для установки максимального значения индикатора выполнения на интерфейсе пользовательского интерфейса. Этот BLOB-объект находится в облачном хранилище, но использует API хранилища BLOB-объектов из пакетов App Engine для извлечения BLOB-объектов. Ниже возвращается с кодом состояния 200:

response.headers['Content-length'] = blobstore.BlobInfo(version.blob_key).size
return response

Он принимается с использованием пакета Requests и выполняет потоковую передачу получаемых данных ( Это нормально, поскольку все заголовки принимаются в объекте Response перед передачей данных. начинается потоковое вещание ). Мой код выглядит примерно так:

with requests.get(url='/api/download', stream=True) as r:
    print(r.headers)

Однако заголовок Content-length не установлен. Вместо этого я получаю нечто подобное из print() выше:

{'Cache-Control': 'no-cache', 
 'Content-Type': 'text/plain; charset=utf-8', 
 'X-Cloud-Trace-Context': '1bca54f9cdae7394de6cb2f1e824ba6f', 
 'Transfer-Encoding': 'chunked',
 'Date': 'Thu, 26 Apr 2018 11:36:17 GMT',
 'Server': 'Google Frontend'}

Я заметил из этого поста , что App Engine удаляет заголовок длины содержимого и заменяет его на правильный размер, но я не получаю заголовок длины содержимого для начала. Что я делаю неправильно? Я неправильно подаю клиенту блоб? Является ли длина содержимого просто недоступной и не может быть установлена? Если да, как я могу получить размер файла, чтобы я мог вычислить размер моего индикатора выполнения пользовательского интерфейса?

1 Ответ

0 голосов
/ 26 апреля 2018

Заголовок Content-Length включен в список заголовков, которые нельзя изменить .

Как указали вы и документация, App Engine вычисляет заголовок Content-Length из данных запроса и добавляет его к запросу перед отправкой.

Вы всегда можете установить персонализированный заголовок, Flask это разрешит, а GAE позволит вам его использовать.

Например, для вашего ответа:

response.headers['CL-blob'] = blobstore.BlobInfo(version.blob_key).size
...