最近在学着用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错误,那在实际写代码的时候也可以尝试一下,因为并不会对整体造成影响。