Как вернуть изображения и json с отдельных маршрутов в одном приложении Chalice? - PullRequest
0 голосов
/ 18 мая 2019

У меня есть этот минимально завершенный, проверяемый пример приложения Chalice:

from chalice import Chalice, Response
from urllib.request import Request, urlopen
from urllib.parse import unquote
import io

app = Chalice(app_name='photo')
app.api.binary_types =['*/*']

@app.route('/get-photo/{url}/{maxWidth}/{maxHeight}', methods=['GET'])
def getPhoto(url, maxWidth, maxHeight):
     return Response(
        load(unquote(url), int(maxWidth), int(maxHeight)),
        headers={ 'Content-Type': 'image/jpeg' },
        status_code=200)

def load(url, maxWidth, maxHeight):
    print(url)
    req = Request(url)
    req.add_header('accept', 'image/jpeg')
    image = urlopen(req).read()
    return thumbnail(image, maxWidth, maxHeight)

from PIL import Image

def thumbnail(image, maxWidth, maxHeight):

    im = Image.open(io.BytesIO(image))
    im.thumbnail((maxWidth,maxHeight), Image.ANTIALIAS)

    with io.BytesIO() as output:
        im.save(output, format="JPEG")
        return output.getvalue()

@app.route('/echo', methods=['POST'])
def preload():
    # MCVE
    return Response(app.current_request.json_body, status_code=200)

В существующем состоянии маршрут /get-photo работает нормально, но конечная точка /echo завершается ошибкой при вызове с curl -H "Content-Type: application/json" -X POST -d '{"test":1}' https://...

[ERROR] ValueError: Expected bytes type for body with binary Content-Type. Got <class 'str'> type body instead.
Traceback (most recent call last):
  File "/var/task/chalice/app.py", line 836, in __call__
    response = response.to_dict(self.api.binary_types)
  File "/var/task/chalice/app.py", line 375, in to_dict
    self._b64encode_body_if_needed(response, binary_types)
  File "/var/task/chalice/app.py", line 392, in _b64encode_body_if_needed
    body = self._base64encode(body)
  File "/var/task/chalice/app.py", line 400, in _base64encode
    % type(data))

Если я удаляю app.api.binary_types =['*/*'], то /echo работает нормально, но вместо этого я сталкиваюсь с проблемой, описанной в Chalice Framework: В запросе не указан заголовок Accept с изображением / jpeg

Как заставить оба этих маршрута работать в одном приложении?

1 Ответ

0 голосов
/ 18 мая 2019

Исправлено путем изменения последней строки на

return Response(json.dumps(app.current_request.json_body).encode('utf-8'), status_code=200)

UPDATE

Это работало некоторое время, пока я не столкнулся с дополнительными проблемами. Затем я разделил приложение на две части в зависимости от типа возвращаемого значения.

...