• flask的模板渲染


    模板引擎传参

    在视图函数中

    • render_template传参的时候以关键字实参进行传参。可以传多个,可以用**讲字典打散成关键字实参。

    在模板中

    • jinja2模板引擎支持接收变量在用 {{}}包裹参数进行接收
    • 并且如果发现是字典,可以用.字典里面的key取出value值。也可以直接字典跟[]进行取值。
    实例1(第一种传参方式):

    目录结构

    │ server.py
    │
    └─templates # 文件夹
            index.html
    

    server.py

    @app.route('/')
    def index():
     
        return render_template('index.html',name="mark",age=18)
    

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板传参</title>
    </head>
    <body>
        {{name}}
        {{age}}
    </body>
    </html>
    
    实例2(第二种传参方式):

    目录结构:同上

    server.py

    @app.route('/demo1/')
    def demo1():
        context_dict = {"name":"mark",
                   "age":"mark",
                   "sex":"girl"}
     
        return render_template('index.html',context_dict = context_dict)
    

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板传参</title>
    </head>
    <body>
        {{context_dict.name}}
        {{context_dict.age}}
        {{context_dict.sex}}
    </body>
    </html>
    
    实例3(第三种传参方式):

    目录结构:同上

    server.py

    def demo2():
        context_dict = {"name": "mark",
                   "age": "mark",
                   "sex": "girl",
                    "other_info":{"tel":1365,
                                   "qq":565656}}
     
        return render_template('index.html',**context_dict)
    

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板传参</title>
    </head>
    <body>
        {{name}}
        {{age}}
        {{sex}}
        {{other_info.tel}}
        {{other_info["qq"]}}
    </body>
    </html>
    

    模板中使用url_for()

    在模板中如果有使用url的需求,我们可以直接手写一个url,也可以使用{{ url_for('视图函数名') }动态翻转一个url。

    实例:

    项目目录:

    │ server.py
    │
    └─templates # 文件夹
            index.html
            info.html
    

    server.py

    @app.route('/')
    def index():
     
        return render_template('index.html', name="mark", age=18)
     
     
    @app.route('/info/')
    def info():
     
        return render_template('info.html')
    

    info.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>信息页面</title>
    </head>
    <body>
        <h1>这是信息页面</h1>
    </body>
    </html>
    

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板传参</title>
    </head>
    <body>
        <a href="/info/">正常跳转</a>
        <a href="{{ url_for('info') }}">urlfor跳转</a>
    </body>
    </html>
    

    Markup转换变量中的特殊字符

    在模板渲染中,使用Markup转换变量中的特殊字符,Markup对字符串进行转译处理再传递给render_template()函数

    markup是在后台处理数据

    from flask import Flask, render_template, Markup
     
    app = Flask(__name__)
    app.debug = True
     
    def func1(arg, tank):
        # 在模板渲染中,使用Markup转换变量中的特殊字符,Markup对字符串进行转译处理再传递给render_template()函数
        # 前台可使用{{ ht1("json", "tank") }}进行传参
        return Markup(f"<h1>饼哥真帅,{arg} is sb {tank} is same as {arg}</h1>")
     
     
    @app.route("/")
    def index():
        return render_template("index.html", ht1=func1)
     
     
    if __name__ == '__main__':
        app.run()
    
    <body>
    <h1>我是index页面</h1>
    <table>
    {{ ht1("jason", "tank") }}
    </body>
    

    safe将html生成安全的文本

    safe是在前台处理数据

    from flask import Flask, render_template, Markup
     
    app = Flask(__name__)
    app.debug = True
     
     
    @app.route("/")
    def index():
        # 前台想要解析ht标签,需要使用模板语法的safe,例如:{{ ht| safe }}
        return render_template("index.html", ht="<h1>饼哥真帅</h1>")
     
     
    if __name__ == '__main__':
        app.run()
    
    <body>
    {{ ht|safe }}
    </body>
    

    jinja2中模板语法之for循环

    for循环可以便利任何一个可迭代对象,包括列表、字典等,支持反向遍历

    反向遍历实例

    server.py{% for country in countrys %} 改为 {% for country in countrys|reverse %}

    for循环常用变量表

    for循环常用变量 功能描述
    loop.index 当前循环的索引(从1开始)
    loop.index0 当前循环的索引(从0开始)
    loop.first 是否是第一次循环,是返回True,否则返回Flase
    loop.last 是否是最后一次循环,是返回True,否则返回Flase
    loop.length 总共可以循环的次数 / 迭代器的长度

    for循环中的else用法

    for还可以else分支语法,如果for内部没有遍历出来内容,那么就会走else分支,反之如果for循环遍历出了内容,则不会运行else分支。

    注意:jinja2中的forelse逻辑不通于python在此不要类比python中的 forelse

    {% for country in countrys|reverse %}
            <p>{{ country }}</p>
        {% else %}
            <p>没有值</p>
        {% endfor %}
    

    示例代码:

    from flask import Flask, render_template, Markup
     
    app = Flask(__name__)
    app.debug = True
     
     
    USERS = {
        1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
        2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
        3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
    }
     
     
    @app.route("/")
    def index():
        return render_template("index.html", user=USERS)
     
     
    if __name__ == '__main__':
        app.run()
    
    <body>
    <h1>我是index页面</h1>
    <table>
        {% for k, v in user.items() %}
        <tr>
            <td>{{k}}</td>
            <td>{{v.name}}</td>
            <td>{{v['name']}}</td>
            <td>{{v.get('name')}}</td>
            <td>{{url_for('index')}}</td>
        </tr>
        {% endfor %}
    </table>
    </body>
    

    jinja2模板语法之if语句

    示例代码:

    from flask import Flask, render_template, Markup
     
    app = Flask(__name__)
    app.debug = True
     
     
    @app.route("/")
    def index():
        return render_template("index.html", name="jason")
     
     
    if __name__ == '__main__':
        app.run()
    
    <body>
    <h1>我是index页面</h1>
     
    <div>{{name}}</div>
     
    {% if name == "jason"%}
    <h1>is sb</h1>
    {% else %}
    <h1>帅哥</h1>
    {% endif %}
     
    </body>
    
  • 相关阅读:
    Linux目录结构详解
    Linux快捷键列表
    正则表达式
    Python内置函数7
    Python内置函数6
    Python内置函数5
    什么才是java的基础知识?
    单点登录原理与简单实现
    window系统 查看端口 被哪个进程占用了
    Linux Tomcat日志查看实用命令
  • 原文地址:https://www.cnblogs.com/cnhyk/p/12755934.html
Copyright © 2020-2023  润新知