flask学习二

Flask中默认的模板语言是Jinja2
I. Jinja2模板语言中的 for

{% for foo in g %}

{% endfor %}

II. Jinja2模板语言中的 if

{% if g %}

{% elif g %}
    
{% else %}
    
{% endif %}

后端专递值给前端Jinja2 模板

return render_template('student.html', student=STUDENT_DICT, a_b=a_b)

return render_template("all_student.html", **{"student":STUDENT ,
                           "student_list" : STUDENT_LIST,
                           "student_dict": STUDENT_DICT})

Jinja2 的高阶用法

1.safe

前端方法:
tag = "<input type='text' name='user' value='DragonFire'>"
{{ tag | safe }}

后端方法:
tag = "<input type='text' name='user' value='DragonFire'>"
markup_tag = Markup(tag)  # Markup帮助咱们在HTML的标签上做了一层封装,让Jinja2模板语言知道这是一个安全的HTML标签

2.在Jinja2中执行Python函数(模板中执行函数)

后端代码:
def a_b_sum(a,b):
    return a+b

@app.route("/")
def index():
    return render_template("index.html", tag=a_b_sum)

前端代码:
<body>
    {{ tag }}
    <br>
    {{ tag(99,1) }}      # 网页展示计算结果 100
</body>

还可以定义全局函数,无需后端传递给前端,Jinja2直接就可以执行的函数

后端代码:
@app.template_global()
def a_c(a,c):
    return a + c


@app.template_filter()
def a_c_b(a,c,b):
    return a + c +b

@app.route("/")
def index():
    return render_template("index.html", tag="")

前端代码:
<body>
    {{ a_c(1,2) }}
    <br>
    {{ 2 | a_c_b(1,4) }}      # 网页展示计算结果 2 + 1 + 4
</body>
尤其是@app.template_filter() 它的调用方式比较特别,这是两个Flask中的特殊装饰器

3.Jinja2模板复用 block

母版:index.html
<body>
    <h1>Welcome OldboyEDU</h1>
    <h2>下面的内容是不一样的</h2>
    {% block content %}

    {% endblock %}
    <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
    <h1>OldboyEDU is Good</h1>
</body>

子板:login.html 
{% extends "index.html" %}      # 继承母版
{% block content %}      # 替换block内容
    <form>
        用户名:<input type="text" name="user">
        密码:<input type="text" name="pwd">
    </form>
{% endblock %}

在这两个页面中,只有 block 中的内容发生了变化,其他的位置完全一样
4.Jinja2模板语言的模块引用 include
login.html 文件中的内容:

<form>
    用户名:<input type="text" name="user">
    密码:<input type="text" name="pwd">
</form>

index.html 文件中的内容:

<body>
    <h1>Welcome OldboyEDU</h1>
    <h2>下面的内容是不一样的</h2>
    {% include "login.html" %}
    <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
    <h1>OldboyEDU is Good</h1>
</body>

看到的结果,这就是将 login.html 当成一个模块,加载到 index.html 页面中

5.Jinja2模板语言中的宏定义

前端代码:
<body>

<h1>Welcome OldboyEDU</h1>

{% macro type_text(name,type) %}
    <input type="{{ type }}" name="{{ name }}" value="{{ name }}">
{% endmacro %}

<h2>在下方是使用宏来生成input标签</h2>

{{ type_text("one","text") }}
{{ type_text("two","text") }}

</body>

宏定义一般情况下很少应用到,但是要知道有这么个概念

posted @ 2020-07-17 15:55  小渣猫  阅读(83)  评论(0)    收藏  举报