我应该在flask sqlite数据库中为图像使用什么数据类型?[duplicate]

pkmbmrz7  于 2022-11-30  发布在  SQLite
关注(0)|答案(2)|浏览(133)
    • 此问题在此处已有答案**:

Serve image stored in SQLAlchemy LargeBinary column(1个答案)
17小时前关门了。
我在Flask的sqlite数据库中有一个db.model,它看起来像这样:

class Drink(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), index = True)
    kind = db.Column(db.String(64), index = True)
    image = db.Column(db.LargeBinary)

    def __init__(self, name, kind, image):
        self.name = name
        self.kind = kind
        self.image = image

    def __repr__(self):
        return '<Drink %r>' % self.name

所以,这个问题是,我有一个列,image,它将是一个实际的图片,但我不知道在flask代码中使用什么数据类型。
下面是 flask 代码:* * flask **

class DrinkAPI(Resource):
    def __init__(self):
        self.reqparse = reqparse.RequestParser()
        self.reqparse.add_argument('name', type = str, required = True, help = 'No name title provided', location = 'json')
        self.reqparse.add_argument('type', type = str, required = True, help='No type provided', location = 'json')
        self.reqparse.add_argument('image', type = blob, required = True, help='No image provided', location = 'json')
        super(DrinkAPI, self).__init__()

    def get(self, id):
        if checkDrink(id):
            info = getDrinkInfo(id)
            return {'id': id, 'name': info[0], 'type':info[1], 'image': info[2]}
        abort(404)

    def put(self, id):
        if checkDrink(id):
            args = self.reqparse.parse_args()
            deleteDrink(id)
            drink = Drink(args['name'], args['type'], args['image'])
            addDrink(drink)
            return {'drink' : marshal(drink, drink_fields)}, 201 
        abort(404)

    def delete(self, id):
        deleteDrink(id)
        return { 'result': True}

看看我在哪里把imagereqparse的类型设置为blob?这甚至不是一个实际的数据类型,但我不知道该放什么。我需要把fields.Raw子类化吗?有什么想法吗?谢谢

    • 解决问题的新方法**

根据一些评论,我似乎应该将图像存储在我的静态文件夹中。我可以做到这一点。但是我如何在我的数据库中引用它呢?它是一个对应于.jpg文件的字符串吗?

cxfofazt

cxfofazt1#

解析器.add_argument('图片',类型=工作部件.数据结构.文件存储,位置='文件')

rlcwz9us

rlcwz9us2#

通常,像这样的图像除了被服务出来之外,还需要从浏览器上传。
出于这个原因,我使用Flask-Uploads,它在上传和提供服务时为您处理所有的存储和命名问题。
下面是一个如何使用它的文档示例:

photos = UploadSet('photos', IMAGES)

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST' and 'photo' in request.files:
        filename = photos.save(request.files['photo'])
        rec = Photo(filename=filename, user=g.user.id)
        rec.store()
        flash("Photo saved.")
        return redirect(url_for('show', id=rec.id))
    return render_template('upload.html')

@app.route('/photo/<id>')
def show(id):
    photo = Photo.load(id)
    if photo is None:
        abort(404)
    url = photos.url(photo.filename)
    return render_template('show.html', url=url, photo=photo)

使用.保存()方法将传入的文件存储在目录中。Flask-Uploads将返回保存文件时使用的文件名。稍后,使用.url()或.path()获取对已保存文件的引用。

相关问题