HeZzz

也可以是 9¾

写 Python Web 项目时,如果页面内容里既有固定结构,又有动态数据,那通常就会接触到模板引擎。比如用户列表、文章详情页、后台管理页,这些内容的 HTML 结构大体固定,但里面的数据是运行时才知道的。

Jinja2 就是这类场景里最常见的模板引擎之一。它在 Flask 生态里尤其常见,但并不只服务于 Flask。简单说,它的作用就是把模板和数据组合起来,最后渲染成真正的文本输出,最常见的是 HTML。

阅读全文 »

做微服务或者分布式系统时,最容易遇到的一类问题不是“功能有没有写出来”,而是“问题出了以后到底该去哪里看”。接口慢了、某个服务超时了、数据库抖了、链路中间断了,单靠日志一层一层翻,很多时候会很难排查。

这时候就会用到像 SkyWalking 这样的观测平台。它最常见的用途当然是链路追踪,但它实际上不只做 tracing,还把指标、日志、拓扑、性能分析这些内容放到了同一套系统里。

阅读全文 »

写 Spring 的时候,经常会看到一些看起来像小型脚本的写法,比如 #{...}@Value("#{systemProperties['user.home']}")@PreAuthorize("hasRole('ADMIN')")。这些东西看起来不像普通 Java 代码,但又确实在项目里经常出现。

这些表达式背后用到的,就是 SpEL。它的全称是 Spring Expression Language,也就是 Spring 表达式语言。简单说,它是 Spring 提供的一套表达式机制,用来在运行时读取数据、调用方法、做条件判断。

阅读全文 »