我认为在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
让它从内存中返回图像而不加载它。
答案 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"