zoukankan      html  css  js  c++  java
  • 【flask】flask render_template 用法

    我们之前的视图函数,返回的都是简单的'Hello Wolrd'之类的字符串,怎么返回一个html呢?首先我们在templates文件夹建立一个html文件,内容随便写一点如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Index</title>
    </head>
    <body>
    <h1>This is index page</h1>
    </body>
    </html>

    我们可以使用Flask对象appsend_static_file方法,使视图函数返回一个静态的html文件,但现在我们不使用这种方法,而是使用flaskrender_template函数,它功能更强大。
    flask中导入render_template,整体代码如下:

    from flask import Flask, render_template
    import config
    
    app = Flask(__name__)
    app.config.from_object(config)
    
    
    @app.route('/')
    def index():
        return render_template('index.html')
    
    if __name__ == '__main__':
        app.run()
    

    render_template函数会自动在templates文件夹中找到对应的html,因此我们不用写完整的html文件路径。用浏览器访问'/'这个地址,显示结果如下:

    clipboard.png

    那么为何称之为模板呢?因为render_template不仅能渲染静态的html文件,也能传递参数给html,使一个html模板根据参数的不同显示不同的内容,这是因为flask使用了jinja2这个模板引擎。要使用模板,在render_template参数中以key=value形式传入变量,在html中使用{{key}}来显示传入的变量,例如:

    # 视图函数
    @app.route('/')
    def index():
        return render_template('index.html', contents='This is index page')
    
    # html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Index</title>
    </head>
    <body>
    <h1>{{ contents }}</h1>
    </body>
    </html>    

    浏览器显示的结果与上文是一样的。我们还可以直接把一个类的实例传递过去,并在模板中访问类的属性,例如假设一个类对象objab属性,关键部分的代码如下:

    # 视图函数中
    return render_template('index.html', object=obj)
    
    ...
    # html中
    <p>a: {{ object.a }}</p>
    <p>b: {{ object.b }}</p>

    传入一个字典也可以,并且在模板中既可以用dict[key],也可以用dict.key


    使用过滤器,可以在html中对传入的变量进行处理,其格式是{{ 变量 | 过滤器 }},例如将前文的{{ contents }}修改为{{ contents | upper}},浏览器显示的内容就变成了:

    clipboard.png

    所以我们可以很容易就理解,过滤器其实就是以变量为参数的函数,返回处理后的结果,在后端一样可以先用字符串对象的upper()函数处理好再传递给模板,效果是完全一样的。jinja2自带了一些过滤器,例如length/reverse/lower等等 ,并且我们也可以自己按照需求自定义过滤器,模板还支持{{ 变量 | 过滤器1 | 过滤器2 | ... }}这样的操作。想要深入了解的话,可以搜索jinja2过滤器去进一步学习。


    模板中还可以使用if elsefor in控制语句,与变量使用{{ }}不同,控制语句要放在{% %}里,例如前文的contents传入一个list:

    contents=[i for i in range(10)]

    html中代码如下:

    <h1>
        {% for i in contents %}
            {{ i }}{# 注意i也要用两个大括号 #}
        {% endfor %}
    </h1>

    使用for遍历contents的内容,并用{{ i }}显示出来,同时还用{# #}加了一个注释,还要注意需要使用{% endfor %}来提示循环区域的结束,因为html不像python那样通过缩进来判断循环的区域,if也是同理。浏览器显示结果:

    clipboard.png

    最后forif结合使用:

    <h1>header</h1>
        {% for i in contents %}
            <p>
            {% if i%2 == 0 %}
                {{ i }}是偶数{# 注意i也要用两个大括号 #}
            {% else %}
                {{ i }}是奇数
            {% endif %}
            </p>
        {% endfor %}

    结果如下(只是演示一下,不要吐槽排版和美观):

    clipboard.png

    关注公众号 海量干货等你
  • 相关阅读:
    CSS简要内容
    HTML简要内容
    java中的多线程
    java中的IO流
    hash
    java中的集合
    java中的数组
    java中的异常机制(编译时异常)
    静态变量和静态方法的访问权限
    成员变量和成员方法的访问权限
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734246.html
Copyright © 2011-2022 走看看