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