Приложение без сервера Flask работает локально, выдает ошибку при развертывании на AWS Lambda - PullRequest
0 голосов
/ 30 марта 2020

Обновление: я чувствую, что это ошибка в поддержке Serverless Framework для приложений WSGI, потому что я могу развернуть идентичный код на AWS, используя Zappa, и это работает.

У меня есть этот бит Flask кода, который отлично работает при локальном запуске с использованием сервера Flask dev. Я могу отправлять POST-запросы на локальный сервер dev, и все это работает, но выдает ошибку, когда отправляю POST-запросы тому же приложению при развертывании на AWS с использованием Serverless Framework. Я был бы очень признателен за мысли по этой проблеме.

Соответствующая часть трассировки стека, сгенерированная PIL Image.open (), такова:

File "/var/task/app.py", line 30, in media
    img = Image.open(image)
  File "/var/task/PIL/Image.py", line 2590, in open
    % (filename if filename else fp))
OSError: cannot identify image file <FileStorage: 'clipart.png' ('image/png')>

Вот код:

from flask import Flask, request
from PIL import Image
from io import BytesIO, StringIO
from werkzeug.utils import secure_filename


app = Flask(__name__)
app.debug=True


@app.route('/', methods=['GET', 'POST'])
def media():

    response = ""
    if request.method == 'POST':

        try:
            image = request.files['file']
            #  Variations tried with no difference:
            #  image = request.files['file'].read()
            #  image = request.files['file'].stream
            #  image = request.files['file'].stream.read()


            if isinstance(image, str):
                print("Trying to open the image with StringIO")
                img = Image.open(StringIO(image))

            elif isinstance(image, (bytes, bytearray)):
                print("Trying to open the image with BytesIO")
                img = Image.open(BytesIO(image))

            else:
                print("Trying to open the image without BytesIO or StringIO")
                img = Image.open(image)
                response = {}
                response['shape'] = (img.size[0], img.size[1])

        except Exception as e:
            print("An exception occured: {}".format(e))
            raise e

        else:
            print("Everything worked!")

    else:
        response = {"GET":"request"}

    return response
...