Python 我应该为flask sqlite数据库中的图像使用什么数据类型?

Python 我应该为flask sqlite数据库中的图像使用什么数据类型?,python,sqlite,types,flask-extensions,Python,Sqlite,Types,Flask Extensions,所以我在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.LargeBina

所以我在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
查看我在哪里将
图像的
reqparse
类型设置为
blob
?这甚至不是一个实际的数据类型,但我不知道该放什么。我是否需要对
字段.Raw进行子分类?有什么想法吗?谢谢


问题的新方法


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

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

因此,我使用它来处理上传和服务时的所有存储和命名问题

下面是一个如何使用它的文档示例:

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)
photos=UploadSet('photos',IMAGES)
@app.route('/upload',methods=['GET','POST'])
def upload():
如果request.method==request.file中的“POST”和“photo”:
filename=photos.save(request.files['photo'])
rec=Photo(filename=filename,user=g.user.id)
记录存储()
闪光灯(“照片已保存”)
返回重定向(url_表示('show',id=rec.id))
返回呈现模板('upload.html')
@应用程序路径(“/photo/”)
def显示(id):
照片=照片。加载(id)
如果照片为无:
中止(404)
url=photos.url(photo.filename)
返回呈现模板('show.html',url=url,photo=photo)

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

解析器。添加参数('picture',type=werkzeug.datastructures.FileStorage,location='files')

为什么不将图像的文件位置存储在db中?通常最好将图像/大型二进制数据存储在文件系统中。不确定您的特定SQLite实现,但大多数框架都有简单的方法向文件系统上传/提供图像,并在DB中存储密钥或路径。如果你打算使用数据库,也许可以试试:但要注意,这比使用文件系统和提供静态文件效率要低得多。我想,只在静态文件夹中保存图像是可以的。那么,我的数据库中只有一个
字符串
,它是图片本身的路径?这是怎么回事?数据库如何知道这是一个路径,而不仅仅是一个奇怪的字符串?这难道不能解决如何在DB中表示它的问题吗?Flask Uploads有一个.save()方法,它将接受上载,将其存储在目录中,并返回一个文件名,然后将其存储在数据库中。稍后,当您要检索文件时,可以使用.path()方法,将保存的文件名传递给该方法,它将返回完整的文件路径。是的,这个答案实际上不会告诉您如何在数据库中存储图像。关键是你无论如何都不想这么做。您应该直接从文件系统提供图像文件,事实上所有静态内容,最好是通过“真正”的web服务器(apache/nginx/which)而不是通过Flask提供。@AlexChumbley,他修改了底部的问题,没有更改问题的标题。不符合规范,但是,请不要信任用户给定的文件名,并始终在存储这些文件名之前对其进行哈希。。。很好的阅读:+1并接受了答案,因为它不需要使用html页面和上载按钮,只需要API请求
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)