golang text/template & python Jinja2

模板语法

模板语法都包含在{{和}}中间,其中{{.}}中的点表示当前对象。

如果想清除左右的空格,则需要添加-符号,{{- 清除左边空格 -}} 清除右边的空格。

golang text/template示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package main

import (
	"log"
	"os"
	"text/template"
)

func main() {
	const temp = `#{{.Symbol}}
⏰  Period: {{.Period}}
💰  Price: ${{.Price}}
{{- if (gt .Chg 0.0)}}
📈  24h Chg: {{.Chg}}%
{{- else}}
📉  24h Chg: {{.Chg}}%
{{- end}}
`

	type Temp struct {
		Symbol string  `json:"symbol"`
		Period string  `json:"period"`
		Price  float64 `json:"price"`
		Chg    float64 `json:"chg"`
	}

	t2 := template.Must(template.New("temp").Parse(temp))
	var rs = []Temp{
		{
			Symbol: "BTC",
			Period: "24Hour",
			Price:  45289.38,
			Chg:    0.09,
		},
	}
	for _, r := range rs {
		err := t2.Execute(os.Stdout, r)
		if err != nil {
			log.Println("executing template:", err)
		}
	}
}

使用 Jinja2 模板

Jinja2 是一个 Python 的功能齐全的模板引擎。它有完整的 unicode 支持,一个可选 的集成沙箱执行环境,被广泛使用,以 BSD 许可证授权。

特性:

  • 沙箱中执行
  • 强大的 HTML 自动转义系统保护系统免受 XSS
  • 模板继承
  • 及时编译最优的 python 代码
  • 可选提前编译模板的时间
  • 易于调试。异常的行数直接指向模板中的对应行。
  • 可配置的语法

用Jinja2实现上面go的模板效果如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from jinja2 import Template

def main() -> None:
    temp = '''#{{Symbol}}
⏰  Period: {{Period}}
💰  Price: ${{Price}}
{%- if Chg > 0.0 %}
📈  24h Chg: {{ Chg }}%
{%- else%}
📉  24h Chg: {{ Chg }}%
{%- endif %}
'''
    template = Template(temp)
    print(template.render(Symbol="BTC",Period="24Hour",Price=45289.38,Chg=0.09))

if __name__ == "__main__":
    main()

FastApi 使用 Jinja2 模板

安装依赖

1
pip install fastapi uvicorn jinja2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import uvicorn
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from starlette.requests import Request

app = FastAPI()

# Setting up Jinja2 templates directory
templates = Jinja2Templates(directory="templates")

@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
    return templates.TemplateResponse("index.html", {"request": request, "title": "Home Page"})

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8000)

index.html模板示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>Welcome to the {{ title }}</h1>
</body>
</html>

运行后即可在浏览器中打开 http://localhost:8000 查看模板页面

1
uvicorn main:app --reload

参考