Docker部署Flask

最近闲得想把flask项目部署到服务器上,参考了官方文档后,最初选择的是Apache的httpd+mod_wsgi。但apache的配置实在是过于繁琐,各种错误频频发生。尽管通过参考一些网上的资料排除了许多故障,但最后的404问题实在不知道怎么解决。之后转战uWSGI+nginx,但最后的nginx error实在是让我束手无策…… httpd和nginx的错误日志里也没有显示什么,项目在开发环境中也没有问题……所以干脆放弃了,改用了Docker。

Read more

关于Flask浏览器缓存问题

最近写大作业需要用到Flask框架,但使用时发现一个致命问题。

起因是我在修改css文件后,重新运行项目,发现前端并没有更改。

原因是在编写前端时,通常会把图片、css、js等文件放在static文件夹下。但这同时也导致了一个问题:在浏览器加载网页时,会留有一份缓存。当重新运行项目,浏览器并没有向后台请求新的样式文件,而是直接加载的缓存。

正常人最初的想法肯定都是把浏览器缓存关掉。但不知为何,我的小chrome不吃这套(摊手。而且把浏览器缓存关掉也不是一个明智的选择。

之后浏览了不少的博客,大多数给出的方法是更改flask的缓存机制,flask配置文件中默认的缓存有效时间是12h。然而直接更改flask设置并不是一个合适的方法。有的博客给出了在项目中的python中的文件中进行此项设置的更改。然而我的小项目也不吃这套(再次摊手。

无奈之下,只能改用最笨的方法:既然浏览器不对后台进行请求,那就让他强行请求就好了。

核心想法是动态更改html中的url,每次请求的url不一样,浏览器便不会加载缓存

于是,在html文件中引入css时,可以采用这种方式:

1
<link rel="stylesheet" href="{{ url_for('static', filename='assets/css/main.css', v=0.0129)}}" >;

每次更改样式文件后,手动更改一下或动态生成版本号,这样浏览器发现版本号对不上后就会重新请求一份。

也可采用时间戳的方式。时间戳的好处在于能够避免重复。

例如我加载本地的图片时,可采用以下方式引入时间戳:

1
2
path = "static/wordcloud.png?timestamp="+new Date().getTime(); //在图片路径后加入时间戳
html = '<img src="'+path+'" alt="wordcloud">';

我承认这个方法很笨,但真的立竿见影

果然,笨方法永远是最好用的。