基于Pycharm的Python-flask 的学习分享 04


前言

在 Flask Web 开发中,前端页面的动态渲染与前后端数据交互是核心需求,Jinja2 模板引擎是实现这一需求的关键工具 —— 它能让 Python 代码与 HTML 高效联动,还通过丰富语法和过滤器灵活处理数据展示逻辑。本文从 Jinja2 页面渲染原理切入,结合实战代码,逐步讲解前后端交互、核心语法(参数传递、条件判断、循环)及过滤器使用,帮助读者快速掌握其在 Flask 项目中的应用,为构建动态 Web 页面奠基。


jinja2的学习分享


一、jinja2页面渲染的基本原理实现与前后端交互

页面动态渲染的基本原理就是运用MVC模式编程在构造的实例化蓝图中把前端html的代码以字符串的形式返回;

代码实现

main.c:

from flask import Flask
import os

app = Flask(__name__,template_folder='template')

app.config['SECRET_KEY'] = os.urandom(24)

from controller.index import index
app.register_blueprint(index)

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

===========================================
controller/index:

from flask import Blueprint, render_template

index = Blueprint('index', __name__)

#页面会返回粗体文字
@index.route('/index')
def my_index():
    return "<strong>我是首页</strong>"

#把前端代码当成一个字符串返回出来,就可以把页面渲染起来了
@index.route('/index2')
def my_index2():
    str = """
        <!DOCTYPE html>
        <html>
            <head>
            <meta charset="utf-8"> 
            <title>实现页面跳转</title>
            <style>
            span{
                display: inline-block;
                width: 200px;
                height: 200px;
                line-height: 200px;
                text-align: center;
                background-color: black;
                color: white;
                font-size: 50px;
                }
            </style>
            </head>
            <body>
                <button>点我跳转百度</button>
                <span id="mySpan">5</span>
                <script>

                    var baiduBtn = document.querySelector('button');
                    var mySpan = document.getElementById('mySpan');


                    baiduBtn.addEventListener('click', function(){
                        console.log(location.href);
                        location.href = "https://www.baidu.com";
                    });


                    var timer = 5; 

                    setInterval(function(){
                        if(timer == 0){  
                            location.href = "https://www.baidu.com";
                        }else{
                            mySpan.innerHTML = timer;  
                            timer--; 
                       }
                    }, 1000);
                </script>
        </body>
    </html>
        """
    return str

#最基础的python代码和前端代码联动,实现按钮跳转和5s自动跳转
@index.route('/index3')
def my_index3():
    username = "gao"
    s = "<strong>{}</strong>".format(username)
    return s

#替换字符串中常量,实现按钮跳转并且10s后自动跳转
@index.route('/index4')
def my_index4():
    str = """
        <!DOCTYPE html>
        <html>
            <head>
            <meta charset="utf-8"> 
            <title>实现页面跳转</title>
            <style>
            span{
                display: inline-block;
                width: 200px;
                height: 200px;
                line-height: 200px;
                text-align: center;
                background-color: black;
                color: white;
                font-size: 50px;
                }
            </style>
            </head>
            <body>
                <button>点我跳转百度</button>
                <span id="mySpan">5</span>
                <script>
                    
                    var baiduBtn = document.querySelector('button');
                    var mySpan = document.getElementById('mySpan');

                    
                    baiduBtn.addEventListener('click', function(){
                        console.log(location.href);
                        location.href = "https://www.baidu.com";
                    });

            
                    var timer = {{timer}}; 
                   
                    setInterval(function(){
                        if(timer == 0){  
                            location.href = "https://www.baidu.com";
                        }else{
                            mySpan.innerHTML = timer;  
                            timer--; 
                       }
                    }, 1000);
                </script>
        </body>
    </html>
        """
    str = str.replace("{{timer}}","10")

    return str

#打开同级文件夹中的html文件,并且替换变量
@index.route('/index5')
def my_index5():
    with open("template/index.html",encoding="utf-8") as file:
        html = file.read()
    html = html.replace("{{timer}}", "10")
    return html

#直接打开写好的html模板,并且实现变量赋值,实现前后端联动
@index.route('/index6')
def my_index6():
    t = 7
    return render_template("index.html",timer=t)

=====================================================
template/index.html:
<!DOCTYPE html>
<html>
            <head>
            <meta charset="utf-8"> 
            <title>实现页面跳转</title>
            <style>
            span{
                display: inline-block;
                width: 200px;
                height: 200px;
                line-height: 200px;
                text-align: center;
                background-color: black;
                color: white;
                font-size: 50px;
                }
            </style>
            </head>
            <body>
                <button>点我跳转百度</button>
                <span id="mySpan">5</span>
                <script>

                    var baiduBtn = document.querySelector('button');
                    var mySpan = document.getElementById('mySpan');


                    baiduBtn.addEventListener('click', function(){
                        console.log(location.href);
                        location.href = "https://www.baidu.com";
                    });


                    var timer = {{timer}};

                    setInterval(function(){
                        if(timer == 0){  
                            location.href = "https://www.baidu.com";
                        }else{
                            mySpan.innerHTML = timer;  
                            timer--; 
                       }
                    }, 1000);
                </script>
        </body>
    </html>



二、jinja2三个重点基本语法和过滤器

jinja2中三个重点的基本语法就是参数的传递、if判断、for循环;
更多jinja2过滤器:点击前往查看更多jinja2过滤器

代码实现

main.c:
from flask import Flask
import os

#指定文件夹
app = Flask(__name__,template_folder='template')

app.config['SECRET_KEY'] = os.urandom(24)

from controller.index import index
app.register_blueprint(index)

if __name__ == '__main__':
    app.run()
===========================================
controller/index:
from itertools import count

from flask import Blueprint, render_template,session


index = Blueprint('index', __name__)

@index.route('/index')
def my_index():
    #1.session参数的传递
    session['username'] = "高先生"
    #2.对象传递
    article = {
        "title" : "论python语言的学习难度",
        "count" : 2000,
        "content" : "我是文章<strong>内容</strong>"
    }
    return render_template("index.html",article=article)
    
=====================================================
template/index.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>jinja2中的参数传递、for循环、if判断</title>
</head>
<body>
{#第一步交给jinja2模板引擎,第二步才是HTML,所以注释不能用<!-- --> #}
{#注释的正确写法#}
{#jinja2中参数的传递#}
    <div>{{session.get('username')}},欢迎您登录</div>
    <div>文章的标题是:{{article.title}}</div>
    <div>文章的阅读量是:{{article.count}}</div>
{#jinja2中if、else判断#}
    {% if article.count % 2 == 0 %}
    <div>您的阅读量可以被2整除,是一个偶数</div>
    {% else %}
    <div>您的阅读量可以被2整除,是一个奇数</div>
    {% endif %}
{#jinja2中for循环#}
    {% for i in range(10) %}
    <div>当前循环的次数是{{i+1}}</div>
    {% endfor %}

{#最常用的过滤器#}
    {#实现加粗等#}
    <div>{{article.content | safe}}</div>
    {#实现开头字母大写#}
    <div>{{"hello world" | title}}</div>
    {#实现所有字母大/小写#}
    <div>{{"hello world" | upper}}</div>
    <div>{{"hello world" | lower}}</div>
    {#实现所有字母先大后小写#}
    <div>{{"hello world" | upper | lower}}</div>

{#自定义过滤器,add的实现在主程序里#}
    <div>{{ 1 | add}}</div>
</body>
</html>

总结

本文深入解析了 Flask 中 Jinja2 模板引擎的使用:从页面渲染原理出发,通过 “字符串返回前端代码→读取 HTML 文件渲染→render_template联动” 的代码示例,清晰呈现前后端交互过程;重点剖析参数传递、if 条件判断、for 循环三大核心语法,并结合safe(处理富文本)、title(格式化字符串)等过滤器,展现其在数据展示与逻辑控制上的灵活性。掌握 Jinja2 是 Flask 开发中衔接前后端的关键,能高效实现动态页面渲染,为复杂 Web 功能开发提供有力支撑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值