【问题标题】:What datatype should I use for image in my flask sqlite database?我的烧瓶 sqlite 数据库中的图像应该使用什么数据类型?
【发布时间】:2013-12-05 04:17:52
【问题描述】:

所以我在 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代码中使用什么数据类型。

这是烧瓶代码: 烧瓶

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 吗?有任何想法吗?谢谢


问题的新方法

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

【问题讨论】:

  • 为什么不将图像的文件位置存储在数据库中?
  • 在文件系统中存储图像/大型二进制数据通常是一个更好的主意。不确定您的特定 SQLite 实现,但这些框架中的大多数都有简单的方法可以将图像上传到文件系统或从文件系统提供图像,将密钥或路径存储在数据库中。如果您打算使用数据库,不妨试试:stackoverflow.com/questions/11017466/… 但请注意,这比使用文件系统和提供静态文件的效率要低得多。
  • 我想将图像放在静态文件夹中就可以了。那么,我的数据库中只会有一个String,它是图片本身的路径?这是如何运作的?数据库如何知道这是一条路径,而不仅仅是一个奇怪的字符串?

标签: python sqlite types flask-extensions


【解决方案1】:

parser.add_argument('picture', type=werkzeug.datastructures.FileStorage, location='files')

【讨论】:

  • +1 并接受了答案,因为它不需要使用 html 页面和上传按钮,只需 API 请求
【解决方案2】:

通常这样的图像除了被送回之外,还需要从浏览器上传。

因此,我使用 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)

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

【讨论】:

  • 这不是解决了如何在数据库中表示它的问题吗?
  • Flask-Uploads 有一个 .save() 方法,它将上传,将其存储在一个目录中并返回给您一个文件名,然后您可以将其存储在数据库中。稍后,当您要检索文件时,使用 .path() 方法将保存的文件名传递给该方法,它将返回给您一个完整的文件路径。
  • 是的,这个答案实际上并没有告诉您如何将我们的图像存储在数据库中。关键是您确实不想无论如何都想这样做。您应该直接从文件系统提供图像文件,实际上是所有静态内容,最好通过您的“真实”网络服务器(apache/nginx/whatever)而不是通过 Flask。
  • @AlexChumbley,他在底部修改了他的问题,但没有更改问题的标题。
  • 不符合规范,但是,请不要相信用户给定的文件名,并在存储它们之前始终对这些文件名进行哈希处理... 好读:flask.pocoo.org/docs/0.12/patterns/fileuploads
猜你喜欢
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 2013-08-01
相关资源
最近更新 更多