【问题标题】:Working with user uploaded image in Flask在 Flask 中处理用户上传的图像
【发布时间】:2017-04-09 16:51:10
【问题描述】:

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

import flask
from flask import request, render_template
import numpy as np
import pandas as pd
from copy import deepcopy
from werkzeug import secure_filename
from PIL import Image
import catdog

# Initialize the app
app = flask.Flask(__name__)

@app.route("/")
def viz_page():
    with open("frontend.html", 'r') as viz_file:
        return viz_file.read()

@app.route("/uploader", methods=["GET","POST"])
def get_image():
    if request.method == 'POST':
        f = request.files['file']
        sfname = 'images/'+str(secure_filename(f.filename))
        f.save(sfname)

        clf = catdog.classifier()
        #clf.save_image(f.filename)

        return render_template('result.html', pred = clf.predict(sfname), imgpath = sfname)


#--------- RUN WEB APP SERVER ------------#

# Start the app server on port 80
# (The default website port)
app.run(host='0.0.0.0', port=5000, debug=True)

还有模板:

  <!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>

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

额外问题:是否有可能永远不保存图像而只是不断地将其保存在 Flask 中的内存中?理想情况下,我永远不会保存图像,我只是使用它,然后在做出预测后将其扔掉。

【问题讨论】:

    标签: python flask


    【解决方案1】:

    图片应该保存在 /static 文件夹中,所以只需将保存路径更改为 static/images

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

    所以 HTML 模板将准备好,它看起来像这样

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

    【讨论】:

      【解决方案2】:

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

      模型文件内

      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))
      

      【讨论】:

        猜你喜欢
        • 2020-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多