面向切面编程(AOP)

AOP,Aspect Oriented Programming,也叫面向切片编程,是一种编程范式。网上对于AOP的解释都比较繁琐,简单来讲,AOP能通过代理模式对已有的模块进行增强,动态地将代码切入到某个类的指定位置上的思想就是面向切面的编程。

Read more

控制反转和依赖注入

学Spring的时候,接触到两个比较重要的概念,一个是IoC(Inversion of Control),控制反转;一个是DI(Dependency Injection),依赖注入。

Read more

Java反射

Java的反射机制可以让我们在程序运行时动态构建一个对象,获取对象的属性、构造器以及方法。反射会破坏Java代码的封装性,所以一般只用于框架中。反射用得好,能把JVM掀个底朝天(bushi

Read more

JS原型与继承

ECMAScript 2015 中引入的 JavaScript 类实质上是 JavaScript 现有的基于原型的继承的语法糖。类语法不会为JavaScript引入新的面向对象的继承模型。

MDN Web doc

在设计之初,JS本身只是单纯的作为一个用于网页设计的脚本语言,所以其并没有设计得很复杂。而对于继承,JS采用了原型的形式。

Read more

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">';

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

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