AttributeError: у объекта 'Response' нет атрибута 'type' - PullRequest
0 голосов
/ 20 февраля 2020

Может кто-нибудь, пожалуйста, помогите мне с этой ошибкой. Я пытаюсь сохранить изображение из строки запроса. но застрял со следующей ошибкой. Мой код ниже, пожалуйста, игнорируйте ненужные библиотеки

from flask_restful import Resource, Api
import requests
import uuid
from PIL import Image
import urllib.request as urllib
import io

app = Flask(__name__)
api = Api(app)

abc = uuid.uuid4().hex[:6].upper()

class Predict(Resource):
    def get(self):
        url = request.args['url']
        r = requests.get(url)
        fd = urllib.urlopen(r)
        image_file = io.BytesIO(fd.read())
        im = Image.open(image_file)
        return im.save(abc+".png")


api.add_resource(Predict, '/')

if __name__ == "__main__":
    app.run("", port=7999, debug=True)

Ошибка вывода:

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Чтобы сохранить в файл, вам не нужны Image и BytesIO() - вы можете напрямую использовать open() и write()

. Если вы хотите сохранить каждое изображение под другим именем, вам следует создать abc внутри get()

from flask import Flask, request
from flask_restful import Resource, Api
import requests
import uuid

app = Flask(__name__)
api = Api(app)

#abc = uuid.uuid4().hex[:6].upper()  # one name for all images

class Predict(Resource):

    def get(self):
        abc = uuid.uuid4().hex[:6].upper()  # generate new name for new image
        filename = abc + '.png'
        #print(filename)

        url = request.args['url']

        r = requests.get(url)

        f = open(filename, 'wb')  # write in bytes-mode 'wb'
        f.write(r.content)
        f.close()

        return {'status': 'OK', 'name': filename}

api.add_resource(Predict, '/')

if __name__ == "__main__":
    app.run("", port=7999, debug=True)

Вам понадобятся Image и BytesIO, только если вы хотите отредактировать изображение перед сохранением.

from flask import Flask, request
from flask_restful import Resource, Api
import requests
import uuid
from PIL import Image
import io

app = Flask(__name__)
api = Api(app)

#abc = uuid.uuid4().hex[:6].upper() # one name for all images

class Predict(Resource):

    def get(self):
        abc = uuid.uuid4().hex[:6].upper()  # generate new name for new image
        filename = abc + '.png'
        #print(filename)

        url = request.args['url']

        r = requests.get(url)

        fp = io.BytesIO(r.content)
        img = Image.open(fp)

        img = img.resize( (800, 600) )  # resize image

        img.save(filename)

        return {'status': 'OK', 'name': filename}

api.add_resource(Predict, '/')

if __name__ == "__main__":
    app.run("", port=7999, debug=True)
0 голосов
/ 20 февраля 2020

r = requests.get(url) возвращает объект ответа, и вы можете прочитать его содержимое, вызвав r.content, не нужно пытаться открыть объект ответа с помощью urlopen, чтобы затем прочитать его

...