在Flask中使用用户上传的图像

时间:2017-04-09 16:51:11

标签: python flask

我已经建立了一个可以拍摄图像的模型,在像素级别读取它,然后决定图像是否包含猫或狗。出于教育目的,我现在正尝试将其放入Flask应用程序(之前从未使用过Flask)。到目前为止我的工作:用户上传图像,图像由Flask保存到磁盘,图像被操作并发送到模型,模型预测,我从模板生成输出页面。现在我想显示用户上传的图像,我遇到了问题。适用的代码如下:

  <!DOCTYPE html>
  <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>Dog vs Cat</title>
      <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
      <script src="http://d3js.org/d3.v3.min.js"></script>
    </head>
    <body>
      <h3> Prediction: {{ pred }} </h3>
      <br><br>
      <img src={{imgpath}}>
      <script>

      </script>

    </body>
  </html>

模板:

http://localhost:5000/images/cat.4.jpg

我要退回的是“预测:yada yada”部分,它运作良好。但是,图像总是空白。当我看着RegisterHotKey时,我知道这意味着它没有找到正确的位置,但我不确定如何动态抓取我想要的图像。我在这里找到了这个指南:How to pass uploaded image to template.html in Flask我觉得这应该足以帮助我,但我只是没有得到答案试图让我看到的。非常感谢帮助。

奖金问题:是否有可能永远不会保存图像并且不断将其保存在Flask的内存中?理想情况下,我永远不会保存图像,我只是使用它,然后在做出预测之后抛弃它。

2 个答案:

答案 0 :(得分:2)

图像应保存在/ static文件夹中,因此只需将保存路径更改为静态/图像

sfname = 'static/images/'+str(secure_filename(f.filename))

因此,HTML模板将准备就绪,它将如下所示

<img src="/static/images/your_image_here.jpg">

答案 1 :(得分:1)

让我们以购物网站为例, 我们有特定产品的图像。

在模型文件中

from . import db
from flask_login import UserMixin
import os
from flask import url_for
from flask_admin.contrib.sqla import ModelView
from flask_admin import form
from jinja2 import Markup

class Product(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    product_name = db.Column(db.String(50), nullable=False)
    product_description = db.Column(db.String(5000), nullable=False)
    product_price = db.Column(db.Float)
    category_id = db.Column(
        db.Integer,
        db.ForeignKey('category.id'),
        nullable=False)
    images = db.relationship('Image', backref='product', lazy=True)

    def __str__(self):
        return str(self.product_name)


class Image(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    path = db.Column(db.String, unique=True)
    product_id = db.Column(db.Integer, db.ForeignKey('product.id'))

    def __repr__(self):
        return str(self.product)


class ImageView(ModelView):
    """Creating a custom ModelView for the Image Model"""
    def _list_thumbnail(view, context, model, name):
        if not model.path:
            return ''

        return Markup(
            '<img src="%s">' %
            url_for('static',
                    filename=form.thumbgen_filename(model.path))
        )

    column_formatters = {
        'path': _list_thumbnail
    }

    form_extra_fields = {
        'path': form.ImageUploadField(
            'Image', base_path=file_path, thumbnail_size=(200, 100, True))
    }

在您看来,这样

admin.add_view(ModelView(Product, db.session))
admin.add_view(ImageView(Image, db.session))