Jinja

作者: CondorHero | 来源:发表于2021-01-16 19:40 被阅读0次

Python 这个模板渲染引擎的名字起的还是很讲究的,看看官网上作者对这个框架名字的介绍:

Why is it called Jinja?
The name Jinja was chosen because it’s the name of a Japanese temple and temple and template share a similar pronunciation. It is not named after the city in Uganda.

作者以日本词「神社」的日语发音,作为这个框架的名字,如果你想体验下日文「神社」的读法,可以去谷歌翻译感受下,下图是谷歌翻译的截图。

我们再来看看 Jinja 的 LOGO 长成什么样子:

Jinja

看完,你是不是在想这个 LOGO 是不是和日本神社有关系呢,你猜的没错,还真有关系。来看下日本广岛县「严岛神社」里面非常好看的一个「鸟居」

严岛神社 · 鸟居

这下你明白了吧,Jinja 的 LOGO 就是日本严岛神社的鸟居。看来作者挺喜欢日本文化,可能还去过日本。

如果我们较真点的话,作者给自己这个框架取的名字其实是错误的,应该叫 Torii (鸟居)而不是 Jinja(神社)。


问题来了,日本神社文化中最重要的鸟居文化,是怎么来的呢。

日本作家,铃木三重吉根据「古事记」写了一本儿童都能看懂的书——古事记物语,里面有一章 天之岩洞 描写了这样一个故事:

天照大神小姐姐,有一个不听话的弟弟,弟弟比较淘气,淘气本没有什么问题,但是因为姐姐的纵容,导致弟弟杀了人,天照大神就比较难受,责怪自己,没脸见人了,就躲在山洞里面去了,但是天照大神有点中国太阳神的功能,她躲起来了,人间一片黑暗,然后就妖魔横行了。众神肯定看不下去呀,就想着怎么把天照大神给引出来,最后想了一招——跳大神(开玩笑的),众神找来公鸡放在架子上,让美女伴随着鸡叫,在天照大神洞口跳了起来,一阵狂歌乱舞,在山洞里面的天照大神就比较好奇了,外面这是发生了啥,就想着推开石块悄悄地搂一眼,结果一露头石块就被一位叫「手力男」的大神给推开了,天照大神再现人间。

这个故事和鸟居有啥关系呢,我们都知道公鸡蹲的架子叫鸡架,当然鸡睡觉肯定也在鸡架上,这时候也可以改叫鸡居,日文「鸟」和「公鸡」的发音差不多,后来就叫「鸟居」了。

这就是日本鸟居的来历了,另外提一句「古事记物语」这本书也不知道怎么形容,反正我看是写的挺狗血的,比如——「女神之死」这章。

天地创世之初,伊奘诺神与伊奘冉神两位男女神灵来到人间,造了日本岛这个岛屿,然后在上面居住,后来伊奘冉神给伊奘诺神生猴子的时候,挂了。伊奘诺神伤心的不行,就把新出生的孩子给杀了,你没看错是给杀了,狗血的剧情到这还不算完,伊奘诺神还是不愿意接受自己媳妇挂了,追到阴间,见到了死去妻子的模样,被吓得够呛,然后二人就结仇了,刚刚两人还恋恋不舍呢。这剧情反转的过快我已无法接受。

还有好多故事,大家自己去看吧。

Jinja2 的简单使用

无论哪个后端语言的模板渲染,其实都大同小异,你最重要的无非就是掌握两点:

  • 如何往 HTML 文件里面注入变量,Jinja 通过 {{ variable }}
  • 在 HTML 里面如何写逻辑代码,Jinja 通过 {% if a == 10 %}

掌握简单的这两点就行了,完全能应付平时工作中的调试就完了,没必要学的像一个专业的前端,不然前后端分离的不就没意义了吗,好了简单来看一个水果大全的例子。

main.py 文件的内容:

from flask import Flask, render_template

app = Flask(__name__)
@app.route('/fruits', methods=['GET', 'POST'])
def getDataList(): # 视图函数
    dataList = [
        {
            "id": 1,
            "en": "apple",
            "cn": "苹果"
        },
        {
            "id": 2,
            "en": "banana",
            "cn": "香蕉"
        },
        {
            "id": 3,
            "en": "pear",
            "cn": "梨子"
        },
        {
            "id": 4,
            "en": "peach",
            "cn": "桃子"
        },
        {
            "id": 5,
            "en": "grape",
            "cn": "葡萄"
        },
        {
            "id": 6,
            "en": "pineapple",
            "cn": "菠萝"
        },
        {
            "id": 7,
            "en": "mango",
            "cn": "芒果"
        },
        {
            "id": 8,
            "en": "strawberry",
            "cn": "草莓"
        }
    ]
    return render_template('fruits.html', fruits=dataList, title="水果大全")

if __name__ == '__main__':
    app.run()

render_template 函数会在同级目录下的 template 文件夹里面寻找 fruits.html 文件,fruits.html 文件的内容:

<!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>水果大全</h1>
    <ul>
        {% for fruit in fruits  %}
            <li title="{{ fruit.en }}">{{ fruit.cn }}</li>
        {% endfor %}
    </ul>
</body>
</html>

运行,然后浏览器访问查看结果:

好了,用到别的 API 随时查文档:https://jinja.palletsprojects.com/en/2.11.x/

相关文章

网友评论

    本文标题:Jinja

    本文链接:https://www.haomeiwen.com/subject/cvnnaktx.html