Python Flask不更新图像[重复]

Posted

技术标签:

【中文标题】Python Flask不更新图像[重复]【英文标题】:Python Flask Not Updating Images [duplicate] 【发布时间】:2018-01-16 22:32:11 【问题描述】:

这里有一些关于图像的 Flask 问题,但没有一个能解决我的问题。我有一个应用程序可以创建图像,保存它,然后显示它。一次。它应该多次执行此操作(每次更改图像时都应该加载新图像)。它不是;它只显示与其显示的文件名关联的第一张图像。这些文件不再位于静态文件夹中,但会显示在应用程序中。

图像已创建,通过以下方式保存到静态文件夹的子文件夹:

img.save('../source/static/images/characters/.png'
              .format(self.char.name), "PNG")

应用程序通过以下方式加载它:

'<img src="/static/images/characters/.png" '
            .format(self.name) +
            '  title="" '.format(self.name, self.name) +
            'width=100% />'

(通过代码操作添加到烧瓶应用程序中)。

问题是我有两个测试用例:一个是文本出现在图像上(添加的文本在代码的几次迭代中被删除),另一个是 alpha 通道位于错误的位置(RGBA -> ARGB 问题,已解决,但我在网站上看不到新文件)。截至目前,仅在本地运行/测试。正确的图片出现在~\source\static\images\characters。所有 *.py 文件都在源代码中。为了解决这个问题,我需要做什么?

我试过了:

@app.after_request
def add_header(response):
"""
Add headers to both force latest IE rendering engine or Chrome Frame,
and also to cache the rendered page for 10 minutes.
"""
response.headers['X-UA-Compatible'] = 'IE=Edge,chrome=1'
response.headers['Cache-Control'] = 'public, max-age=0'
return response

作为我 app.py 文件末尾的单独代码段,也尝试添加:

app.config["CACHE_TYPE"] = "null"

到调用创建图像的页面的app.route() 的开头。

在可能的单独说明中,图像应该在表格中,但似乎不是......我的意思是,有一个带有标题的表格,然后是一个列中的表格,另一个列中的图像。 ..但第一列的文本在图像下方(尽管每个都在适当的位置)。奇怪,但可能无关。

那么,为什么烧瓶不能正确更新,我该如何强制它这样做呢? (关闭程序并重新打开时问题仍然存在)。

更新:似乎工作......

Using Flask, how do I modify the Cache-Control header for ALL output?

添加:

app = Flask(__name__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 1

到顶部(包括 app = Flask 部分以帮助其他新手),最后:

# No caching at all for API endpoints.
@app.after_request
def add_header(response):
    # response.cache_control.no_store = True
    if 'Cache-Control' not in response.headers:
        response.headers['Cache-Control'] = 'no-store'
    return response

但仅适用于单个实例,其他实例仍然有奇怪的缓存。可以从之前缓存,而另一个刚刚超时,但是这不应该发生,因为我一直关闭服务器(本地主机),对吧?

【问题讨论】:

【参考方案1】:

这似乎有效

Using Flask, how do I modify the Cache-Control header for ALL output?

添加:

app = Flask(__name__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0

到顶部(包括 app = Flask 部分以帮助其他新手),最后是:

# No caching at all for API endpoints.
@app.after_request
def add_header(response):
    # response.cache_control.no_store = True
    response.headers['Cache-Control'] = 'no-store, no-cache, must-
    revalidate, post-check=0, pre-check=0, max-age=0'
    response.headers['Pragma'] = 'no-cache'
    response.headers['Expires'] = '-1'
    return response

这可行,但我的命令提示符窗口中的日志不断发送信息。

【讨论】:

【参考方案2】:

尝试更改图像名称,以便每次重新生成它时它都假装是新图像。您可以使用一些基于时间的文件名后缀。或者您可以更改图像的 url,为其添加一些虚假的 get 参数。

参考: flask cache busting

flask cache busting library

【讨论】:

遇到了同样的问题,使用本地时间作为扩展名对我来说效果很好。这里需要注意的是: 1)时间戳中的“:”字符需要替换,因为它在命名约定中不被接受。 2)在烧瓶中渲染模板时,您必须返回静态文件夹中所有文件的列表。 3) 您必须使用 jinja 代码在 html 中遍历该列表,以找到您在图片名称中插入的命名模式。【参考方案3】:

遇到了同样的问题,使用本地时间作为名称扩展名对我来说效果很好。这里需要注意的是:

    时间戳中的“:”字符需要替换,因为它不被命名约定所接受。 在烧瓶中渲染模板时,您必须返回静态文件夹中所有文件的列表。 您必须使用 jinja 代码在 html 中遍历该列表,才能找到您在图片名称中插入的命名模式。

【讨论】:

以上是关于Python Flask不更新图像[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python flask在html页面上显示图像[重复]

如何将字节数组中的图像发送到从android到具有Flask的python的url [重复]

Flask-SocketIO 动态更新图像

在 Flask 中执行耗时功能时显示“正在加载”图像 [重复]

Flask搭建一个最简单的图像分类项目

自动更新烧瓶模板中的返回数据