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
|
参考