Flask应用程序中的内存数据

时间:2017-06-23 15:20:08

标签: flask

我认为在Flask中使用实例变量的正确方法是添加用户和会话,但我试图测试一个概念,但我还是不想完成所有这些操作。我试图让一个Web应用程序将图像加载到一个变量中,然后可以对其执行不同的图像操作。显然,您不希望在每个新请求上继续对图像执行操作列表,因为这样效率非常低。

有没有办法在Flask中使用app.var我可以从不同的路线访问?我尝试过使用全球背景和Flask的current_app,但我的印象并不是他们的目标。

我的蓝图代码是:

import os
from flask import Flask, url_for, render_template, \
     g, send_file, Blueprint
from io import BytesIO
from PIL import Image, ImageDraw, ImageOps

home = Blueprint('home', __name__)

@home.before_request
def before_request():
    g.img = None
    g.user = None

@home.route('/')
def index():
    return render_template('home/index.html')

@home.route('/image')
def image():
    if g.img is None:
        root = os.path.dirname(os.path.abspath(__file__))
        filename = os.path.join(root, '../static/images/lena.jpg')
        g.img = Image.open(filename)
    img_bytes = BytesIO()
    g.img.save(img_bytes, 'jpeg')
    img_bytes.seek(0)
    return send_file(img_bytes, mimetype='image/jpg')

@home.route('/grayscale', methods=['POST'])
def grayscale():
    if g.img:
        print('POST grayscale request')
        g.img = ImageOps.grayscale(img)
        return "Grayscale operation successful"
    else:
        print('Grayscale called with no image loaded')
        return "Grayscale operation failed"

/image路线正确返回图像,但我希望能够拨打/grayscale,执行操作,并能够再次拨打/image让它从内存中返回图像而不加载它。

1 个答案:

答案 0 :(得分:1)

您可以在会话变量中保存一个键,并使用它来识别全局词典中的图像。但是,如果您使用多个Flask应用程序实例,这可能会导致一些问题。但有一个它会没事的。否则,在与多个工作人员合作时,您可以使用Redis。我没有尝试过以下代码,但它应该显示这个概念。

from flask import session
import uuid

app.config['SECRET_KEY'] = 'your secret key'
img_dict = {}

@route('/image')
def image():
    key = session.get('key')
    if key is None:
        session['key'] = key = uuid.uuid1()

    img_dict[key] = yourimagedata

@home.route('/grayscale', methods=['POST'])
def grayscale():
    key = session.get('key')
    if key is None:
        print('Grayscale called with no image loaded')
        return "Grayscale operation failed"
    else:
        img = img_dict[key]
        print('POST grayscale request')
        g.img = ImageOps.grayscale(img)
        return "Grayscale operation successful"