flask静态资源加载及修改后的同步更新(小记)

在学习Flask进行Web开发时,遇到背景图片加载和304缓存问题。静态资源如图片应存放在'static'文件夹,通过`url_for('static', filename='...')`引用。当修改图片大小后出现304错误,因缓存未更新。尝试设置缓存时间无效,采用上下文处理器记录文件修改时间来刷新资源,但无法完全消除304错误,不过对用户体验影响不大。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学着用flask进行web开发,在添加背景图片的时候遇到了一些坑,记录一下。

首先在web开发的时候需要区分一下静态资源和动态资源(一开始没有想到这个,就开始直接插入背景图片,结果就出现了404错误)

静态资源:固定的前端网页内容,包括图片,html和css样式等,不需要和后台交互就可以进行展示的内容

一般操作:客户端发送请求给web服务器,服务器拿到相应文件返回给客户端,客户端解析渲染后展示

动态资源:会和后台程序或者数据库进行交互的内容

flask渲染网页用到的图片都需要下载之后存到命名为‘static’的文件夹,

然后使用url(‘’)通过相对路径拿static文件夹里的图片。

-------这是一条分割线-------

然后!!!在拿到背景图片之后我发现背景图太大了,想把它缩小点,在style标签下面改了之后,刷新就出现了304错误......后来查了下,说是缓存没有及时更新导致的(因为还没用到cdn,图就存在本地服务器),试了下网上流传的两种方法:

方法1:在后台import timedelta,使用

app.config['send_file_max_age_default'] = timedelta(seconds=1)

把缓存时间间隔设置成1s,然后发现一点用都没有...

方法2:写函数迭代(这个很好用,在设置函数刷新的时候我也用到了类似的方法。

代码像这样:

@app.context_processor
def inject_url():
    data = {
    "url_for": dated_url_for}
    return data


def dated_url_for(endpoint, **values):
    filename = None
    if endpoint == 'static':
        filename = values.get('filename', None)
    if filename:
        file_path = os.path.join(app.root_path, endpoint, filename)
        values['v'] = int(os.stat(file_path).st_mtime)
    return url_for(endpoint, **values)

其中app_context_processor在flask中被称作上下文处理器,借助app_context_processor,可以让所有自定义变量在模板中可见,被@app_context_processor修饰的函数必须返回dict类型的数据

其实这个方法就是记录了下静态文件修改的时间,然后每次都刷新让资源保持在最新(前端也要同时用url_for访问静态资源)。

但是刚刚试了下,其实第二种方法还是不能达到消除304错误的效果,但是对于静态资源来说,一般如果没有特别的问题,304错误不会影响用户的使用体验感。在很多其他的博文中,博主都说可以使用第二种方式来消除304错误,那在实际写代码的时候也可以尝试一下,因为并不会对整体造成影响。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只野生的桔子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值