3 Flask Web开发:记一次flask模板渲染实践

Python Web2 0基础 入门级 提升高手开始:Flask 模板渲染 本文介绍了使用Flask框架进行模板渲染的方法,通过Jinja2模板引擎实现动态数据展示。主要内容包括:1)模板渲染的必要性,解决硬编码HTML的维护难、扩展性差等问题;2)Jinja2基础语法,如变量渲染{{}}、循环判断{%for%}{%if%};3)模板继承机制,通过父模板统一页面结构;4)静态资源管理,使用url_for引用图片等资源。文章以"个人信息页"为例,详细演示了从数据传递、循环渲染到模板继承的完整流程,并提供了常见问题解决方案。Flask模板渲染实现了前后端分离,提高了开发效率和可维护性。 阅读详情

参考文档:

https://flask.palletsprojects.com/en/1.0.x/blueprints/

 

目录结构:

(vpp_agent_venv3.7) [root@localhost source]# tree 
.
├── app
│   ├── __init__.py
│   ├── views
│   │   ├── ik_agent_view.py
│   │   ├── ik_echarts_view.py
│   │   ├── ik_file_view.py
│   │   ├── ik_test_view.py
│   │   ├── ik_user_view.py
│   │   ├── ik_vpp_view.py
│   │   └── __init__.py
├── release
│   └── service
│       ├── ptt_agent.service
│       └── vpp.service
├── release_note.txt
├── requirements.txt
├── templates
│   ├── components.html
│   ├── index2.html
│   ├── index.html
│   ├── internal_server_error.html
│   ├── macro
│   ├── nb_components.html
│   ├── nb_jupyter_globe.html
│   ├── nb_jupyter_lab.html
│   ├── nb_jupyter_lab_tab.html
│   ├── nb_jupyter_notebook.html
│   ├── nb_jupyter_notebook_tab.html
│   ├── nb_nteract.html
│   ├── simple_chart.html
│   ├── simple_globe.html
│   ├── simple_page.html
│   └── simple_tab.html
├── gunicorn_config.py
└── wsgi.py

 

bp+模板渲染+wsgi:

定义蓝图
app/views/ik_echarts_view.py

# rom flask import Flask
from jinja2 import Markup
import random
from pyecharts import options as opts
from pyecharts.charts import Bar
from flask import Blueprint
from flask import request, render_template
from app.ik_global import ik_global
debug = ik_global.Logger.debug

bp = Blueprint('echarts', __name__)

def bar_base() -> Bar:
    c = (
        Bar()
            .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
            .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
            .add_yaxis("商家B", [15, 25, 16, 55, 48, 8])
            .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
    )
    return c

def bar_base2(title="shen", subtitle="xianjie") -> Bar:
    c = (
        Bar()
            .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
            .add_yaxis("商家A", [random.randint(10, 100) for _ in range(6)])
            .add_yaxis("商家B", [random.randint(10, 100) for _ in range(6)])
            .set_global_opts(title_opts=opts.TitleOpts(title=title, subtitle=subtitle))
    )
    return c

""" 
@bp.route("/")
def index():
    c = bar_base()
    return Markup(c.render_embed())
"""

@bp.route("/")
def index():
    args = request.args.to_dict()
    debug("args--> {}".format(args))
    return render_template("index.html")
  

@bp.route("/barChart")
def get_bar_chart():
    args = request.args.to_dict()
    name = args.get("name")
    subtitle = args.get("subtitle")
    c = bar_base2(name, subtitle)
    return c.dump_options_with_quotes()

蓝图注册

app/__init__.py,在注册蓝图时,通过template_folder指定蓝图echarts的template文件加载路径(template_folder="../../templates"),这里echarts使用相对路径寻找template,也可以使用绝对路径。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# File: ik_agent.py
# import sys
from flask import Flask, jsonify
# from flask_jwt import JWT
from config import config
import multiprocessing as mp
from app.ik_global import ik_global, vpp_sig_register
from werkzeug.contrib.cache import SimpleCache
# from app.vpp.vpp import Pttool
from app.comm import ik_comm
# from app.comm.agent_process import AgentProcess
from app.log import log
from app.ik_global.ik_global import MP_LIST
from app.utils.threads import DaemonThreadTimer
from app.comm.ik_thread_work import monitor_vpp_instance_status
from app.utils.ik_util import show_memory_info
from app.utils.auth import authenticate, identity
from app.utils.threads import set_interval
from app.ikdb.exts import db
from flask_jwt import JWT
from werkzeug.contrib.profiler import ProfilerMiddleware
from werkzeug.wsgi import DispatcherMiddleware
from collections import OrderedDict
# from app.views import json_page



def create_app(config_name):
    app = Flask(__name__, template_folder="/srv/web_develop/vpp_agent_dev/agent/source/templates")
    app.config.from_object(config[config_name])
    app.config.setdefault('JWT_SECRET_KEY', 'secret')
    app.debug = True
    # db init
    # 方式一
    db.init_app(app=app)  # 初始化连接数据库
    # 方式二
    # from app.ikdb.exts import connect_db
    # init log
    # log.init_log(app)
    ik_global.Logger = log.create_logger()
    # ik_global.set_printi()
    # ik_global.printi("ssss")
    # mongodb init
    from app.ikdb.model import models_mongo
    ik_global.APP_INSTANCE = app
    ik_global.CACHE = SimpleCache()
    ik_global.USER_CACHE = SimpleCache()

    # blueprint regester
    from app.views import ik_echarts_view
    app.register_blueprint(
            ik_echarts_view.bp, url_prefix="/echarts", template_folder="../../templates")


    ik_global.Logger.info("性能测试工具节点--agent启动成功!")
    ik_global.Logger.info("版本号: {}".format(ik_global.__version__))
    ik_global.Logger.info("agent: {} port: {}".format(
        config[config_name].LISTEN_ADDR, config[config_name].VPP_AGENT_LISTEN_PORT))
    ik_global.Logger.info(show_memory_info("after app started"))
    return app

设置gunicorn_config.py

# -*- coding: utf-8 -*-
import os
import multiprocessing
# from app.ik_global.ik_global import VPP_INSTANCE
ipaddr = os.getenv("LISTEN_ADDR")
port = os.getenv("VPP_AGENT_LISTEN_PORT")
# bind = '10.2.6.117:8082' #your app ip address and port
bind = "{}:{}".format(ipaddr, port)  # your app ip address and port
backlog = 2048

#
# Worker processes

# workers = 1
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'sync'
# worker_class = 'gevent'
worker_connections = 500
# timeout = 120
timeout = 0

keepalive = 2

#
#   spew - Install a trace function that spews every line of Python
#       that is executed when running the server. This is the
#       nuclear option.
#
#       True or False
#

spew = False

#
# Server mechanics
#

daemon = False
pidfile = None
umask = 0
user = None
group = None
tmp_upload_dir = None

#
#   Logging
#
#   logfile - The path to a log file to write to.
#
#       A path string. "-" means log to stdout.
#
#   loglevel - The granularity of log output
#
#       A string of "debug", "info", "warning", "error", "critical"
#

# logconfig = 'logging.conf'
# accesslog = 'log/gunicorn_access.log'
# errorlog = 'log/gunicorn_error.log'
# loglevel = 'warning'
# access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'

#
# Process naming


proc_name = 'ik_pttool'


def post_fork(server, worker):
    server.log.info("Worker spawned (pid: %s)", worker.pid)


def pre_fork(server, worker):
    pass


def pre_exec(server):
    server.log.info("Forked child, re-executing.")


def when_ready(server):
    server.log.info("Server is ready. Spawning workers")


def worker_int(worker):
    worker.log.info("worker received INT or QUIT signal")

    # get traceback info
    import threading
    import sys
    import traceback
    id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
    code = []
    for threadId, stack in sys._current_frames().items():
        code.append("\n# Thread: %s(%d)" % (id2name.get(threadId, ""),
                                            threadId))
        for filename, lineno, name, line in traceback.extract_stack(stack):
            code.append('File: "%s", line %d, in %s' % (filename,
                                                        lineno, name))
            if line:
                code.append("  %s" % (line.strip()))
    worker.log.debug("\n".join(code))


def worker_abort(worker):
    worker.log.info("worker received SIGABRT signal")

配置wsgi.py

from app.ikdb.exts import db
import os
import flask_login
from app.utils.ik_util import show_memory_info
# print(show_memory_info("inital"))
from flask import abort, request, _app_ctx_stack, jsonify, url_for
from app import create_app
from app.ik_global import ik_global
from app.ikdb.model.models import User
from flask_sqlalchemy import get_debug_queries


# import profile

# def get_debug_queries():
#     return getattr(_app_ctx_stack.top, 'sqlalchemy_queries', [])

app = vpp_agent = create_app("production")
info = ik_global.Logger.info
# profile.run('create_app("production")')

login_manager = flask_login.LoginManager()
login_manager.init_app(app)


# 测试使用,重置数据库表
# with app.app_context():
#     # db.drop_all()
#     db.create_all()


@app.before_first_request
def setup():
    ik_global.Logger.info("before_first_request: {}".format(request.url))


@app.before_request
def before_request():
    ik_global.Logger.info("before_request: {}".format(request.url))
#     if not ik_global.VPP_INSTANCE:
#         ik_global.Logger.info("service or device restarting!")
#         ik_global.Logger.info("vpp is None")
#         abort(503)


@app.after_request
def after_request(response):
    ik_global.Logger.info("after_request: {}".format(request.url))
    for query in get_debug_queries():
        if query.duration >= app.config["DATABASE_QUERY_TIMEOUT"]:
            ik_global.Logger.info("Context:{}\n SLOW query: {}\n Params: {}\n Duration: {} ms\n".format(
                query.context, query.statement, query.parameters, query.duration*1000))
    # some stuff here
    ik_global.Logger.info(
        "os.getpid():{}\n os.getppid: {}\n".format(os.getpid(), os.getppid()))
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
    return response


@app.teardown_appcontext
def teardown(exc=None):
    ik_global.Logger.info("teardown_appcontext: ")


""" 
@app.context_processor
def template_extras():
    ik_global.Logger.info("context_processor:")

 
"""

""" 
@app.errorhandler(404)
def page_not_found(error):
    ik_global.Logger.info("errorhandler: {}".format(error))
    return jsonify({"code": 404, "result": "page_not_found"})
"""


@app.errorhandler(401)
def unauthorized(error):
    ik_global.Logger.info("errorhandler: {}".format(error))
    return jsonify({"code": 401, "result": "unauthorized"})


@flask_login.user_logged_in.connect_via(app)  # 信号订阅user_logged_in.connect(fn)
def _track_logins(sender, user, **extra):
    print("_track_logins")
    user.login_count += 1
    user.last_login_ip = request.remote_addr
    result = User.update_one(user.id, **user.serialize)
    ik_global.Logger.info("_track_logins < login_count:{} last_login_ip: {} >".format(
        user.login_count, user.last_login_ip))


@login_manager.user_loader
def user_loader(id):
    print("user_loader")
    user = User.one(id=id)
    ik_global.Logger.info("user_loader: {}".format(user.name))
    return user


@app.template_filter('capitalize')
def reverse_filter(s):
    ik_global.Logger.info("template_filter:")

模板文件:templates/index.html

模板中通过setInterval定时请求http://127.0.0.1:8082/echarts/barChart接口的数据,然后将数据渲染到html

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>动态更新数据</title>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
</head>

<body>
    <div id="bar" style="width:1000px; height:600px;"></div>
    <script>
        var chart = echarts.init(document.getElementById('bar'), 'white', {
            renderer: 'canvas'
        });

        $(
            function () {
                fetchData(chart);
                setInterval(fetchData, 2000);
            }
        )();

        function fetchData() {
            $.ajax({
                type: "GET",
                url: "http://127.0.0.1:8082/echarts/barChart",
                dataType: 'json',
                success: function (result) {
                    chart.setOption(result);
                }
            });
        }
    </script>
</body>

</html>

效果:数据其实是动态变化的

http://127.0.0.1:8082/echarts/

 

Python3使用Flask开发Web项目新手入门开发文档 本文档为Flask入门开发指南,主要包含: 环境搭建:Python安装、虚拟环境创建及Flask基础扩展安装 快速入门:从Hello World程序到项目标准目录结构 核心功能: 模板渲染(Jinja2引擎) 表单验证(Flask-WTF) 用户认证(Flask-Login) 代码示例:提供完整可运行的模板渲染、表单处理和登录注册代码片段 最佳实践:推荐项目结构规范,包含配置文件、路由模块、静态文件等标准目录 文档适合零基础开发者快速上手Flask Web开发,涵盖前端页面到后端逻辑的完整实现流程。 阅读详情

相关推荐

使用Python开发Web应用:Flask入门教程!

🏆本文收录于「编程与技术实战」专栏,此专栏涵盖了C/C++编程、人工智能、数据结构、机器学习等技术领域的内容,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1125

flask的动态网页_关于pyecharts可视化与Flask相结合

关于pyecharts和flask结合的案例不多,查阅了数十篇文章,尝试了若干遍,感觉还是不理想,最大的问题在于对echarts的理解上,对我而言,又需要向上推到ajax,jquery,bootstrap,html,css,javascript等等,有点超出了我的技能范围,所以最大程度的做到能用就够了,复用和进一步优化看起来还是遥遥无期。关于pyecharts可视化与中国经济、人口等数据...

weixin_32797081的博客 1801

Web开发 Flask渲染Html

使用Flask链接HTML页面涉及到几个步骤:设置项目结构、在Flask应用中配置路由和渲染模板、以及编写HTML文件来构建前端界面。在需要显示动态内容的地方,你可以使用Flask提供的模板语言(Jinja2)来插入数据。在Flask项目中,通常会有一个称为templates的文件夹,用于存放所有的HTML文件。在Flask中,你需要使用render_template函数来渲染HTML页面并传递数据到页面中。在上面的例子中,当用户访问根路径('/')时,Flask将渲染index.html页面。

Sanstye_Long的博客 1053

python的flask框架显示柱状图_Python Web框架--框架Flask--PyCharts(四)

一、安装pyechartsEcharts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。特性:简洁的 API 设计,使用如丝滑般流畅,支持链式调用囊括了 30+ 种常见图表,应有尽有支持主流 Notebook 环境,Jupyter Not...

weixin_29486805的博客 738

ffmpeg中av_read_frame阻塞的原因与解决方案

最近用到ffmpeg,想要av_read_frame立即返回,但是看网上的博客,都没有详细的解说,那就自己看源码。 两种方法: 设置回调打断函数和设置超时 超时,但是如果只设置该参数,依然会在av_read_frame中阻塞, av_dict_set(&inputDic, "stimeout", "2*1000*1000", 0); // milliseconds //打断回调 m_avformatCtx->interrupt_callback.callback = interru

weixin_43360707的博客 1万+

用 SQL 分析不同用户群组留存率

一、前言 用户增长对企业非常重要,主要包括: 新增、留存、召回 。本文介绍一个实用的分析留存率的方法: Cohort Analysis (群组分析),APP的下载量越高并不是说产品就越好,产品若没有很好的留存,花费大量时间和资源来挖掘新客户也将是竹篮打水一场空。群组分析有利于衡量用户在每个漏斗的用户流失节点、用户流失数据,从而帮助你发现产品的用户的行为模式和用户增长点。从本质上讲,群组分析Cohort Analysis为你提供了一种数据驱动的方法,用群组分析Cohort Analysis方法,可以来帮助提

qq_39984050的博客 3172

web实战基础(pycharts篇):flask+pycharts渲染网页的三种方式

这是一篇非常非常基础的入门教程,但是也能让你深入了解pycharts的实现机制和带着你深入了解细节的设计,因此非常建议你能看完,相信一定会有所收获! 这一篇讲深入介绍flask+pycharts渲染网页的基础知识。 flask+pycharts渲染网页的三种方式: 1、通过render()函数进行渲染; 2、通过Markup()函数进行渲染; 3、通过dump_options_with_quot...

dhjabc_1的专栏 1万+

ERGM指数随机图模型全解析:从基础原理到R语言实操

从社交网络中的互惠、传递性和同质性等基本现象切入,介绍网络数据与传统回归分析的本质差异——边与边之间的依赖关系。指数随机图模型(ERGM)正是为刻画这种依赖结构而设计的统计框架,它通过指数族分布将网络结构效应显式建模,结合MCMC方法完成参数估计。ERGM在组织协作、传播扩散、生物生态等领域的应用日益广泛,其扩展模型TERGM、GERGM和多层ERGM进一步支持时序、权重与多重关系网络。本文系统梳理ERGM的理论基础、核心统计量、扩展模型选型及R语言实操要点,帮助研究者理解网络生成机制并完成收敛性诊断与结果

weixin_29050271的博客 358

flask mysql项目模板渲染_GitHub - haitaoss/flask_quick_develop: 这是一个基本的项目模板,直接拿过去就能写项目。修改mysql、redis的连接信息即可...

flask_quick_develop这是一个基本的项目模板,直接拿过去就能写项目。修改mysql、redis的连接信息即可项目目录的讲解这是Flask Web项目的基本目录结构蓝图其实就是,蓝图范围内的文件(url路由),先放到一个地方。最终在app注册,蓝图的时候,直接将蓝图里面的信息注册到app中flask_quick_develop是项目的家目录logs存放log日志文件的目录,可以再pr...

weixin_39978863的博客 155

多图详解VSCode搭建Python开发环境

本文通过多图的方式详细介绍了VSCode搭建Python开发环境,希望能对学习Python的同学们有所帮助。 文章目录 1. VSCode的介绍和安装 2. 安装插件 2.1 安装中文插件 2.2 安装Python插件 2.3 安装远程插件 3. 远程连接服务器 3.1 配置ssh 3.2 运行代码 3.3 调试代码

weixin_43178406的博客 8万+

桌面运维工程师面试题汇总(高频完整版)

岗位,覆盖:电脑硬件、系统安装与故障、网络、办公软件、安全、AD域、打印机、日常排错、服务意识。

老韩的Linux云计算架构师进阶之路 911

Flask web开发实战之基础篇 Flask-模板

基础篇 第二章 Flask模板前言3. Flask模板3.1 模板基本用法3.1.1 创建模板3.1.2 模板语法3.1.3 渲染模板3.2 模板辅助工具3.3 模板结构组织3.4 模板进阶实战3.5 本章代码 前言 这一切开始于2010年4月1日,Armin Ronacher在网上发布了一篇关于“下一代Python微框架”的介绍文章,文章里称这个Denied框架不依赖Python标准库,只需要复制一份deny.py放到你的项目文件夹就可以开始编程。伴随着一本正经的介绍、名人推荐语、示例代码和演示视频,

weixin_39451323的博客 1万+

【Frida Android】实战篇4:SSL Pinning 证书绑定绕过 Hook 教程(一)

在前两章中,我们学习了中间人抓包与 Hook 抓包的基础方法,这些方法在理想环境下能够有效获取网络请求数据。但在实际的企业级应用中,出于安全防护需求,很多 APP 会启用证书绑定(SSL Pinning)机制。这种机制会让客户端对服务器证书的校验更为严格,导致常规的抓包方法(即使将 BurpSuite/Charles 证书安装到系统信任区)也无法生效。因此,从本章开始,我们将系统学习 SSL Pinning 机制的绕过技术。SSL Pinning(证书绑定)是客户端校验服务器身份的进阶安全机制。

水滴石穿 1610

Flask 模板渲染

Flask使用Jinja2模板引擎实现动态HTML渲染,支持变量、条件、循环和模板继承。模板文件存放在templates/目录,通过render_template()函数渲染。关键功能包括: 变量插入:{{ name }}动态显示数据 控制结构:{% if %}/{% for %}实现逻辑处理 模板继承:通过base.html定义布局,子模板用{% extends %}复用 静态文件:static/目录存放资源,用url_for()引用 注意事项:确保模板目录正确,避免路径硬编码,生产环境需配合WSGI服务

likuoelie的博客 1152

【零基础学习CAPL】——CAN报文的发送(CRC——ChecSum值)

本章主要介绍带有CRC值的报文发送一般报文可使用CANoe的IG模块直接发送,但带有CRC值的报文就只能编写脚本进行发送,以下详细讲解在配合Panel面板情况下,如何进行带有循环冗余码的报文进行报文的发送。

LOVE135149的博客 1911

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

flask--渲染Jinja模板与传入模板变量

1. 模板简介 模板是一个web开发中必备的模块,因为我们在渲染一个网页的时候,并不只是渲染了一个纯文本字符窜,而是渲染一个有富文本标签的页面,这个时候我们就需要用到模板了。在flask中,配套的模板是Jinja2,Jinja2的作者也是flask的作者。 2. flask中渲染模板 在flask中,如果我们需要渲染一个模板,那么我们就需要用到render_template这个方法了。 在我们新建...

xujin0的博客 3449

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python 小而精Web开发框架Flask精通指南

Flask之旅,始于简单,却不止于平凡。它用简洁的API和强大的扩展性,让你在Web开发的道路上自由驰骋。现在,你是否准备好与Flask一同探索,开启你的编程新篇章?未来的无限可能,正在等待你的解锁。

weixin_54217348的博客 2597

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

WEB开发 - Flask 入门:Jinja2 模板语法进阶 Python

在上一阶段,我们一起学习了基于Python地 web框架Flask,并且初步了解了这个框架有一种渲染方式叫做 模板语法,今天,我们一起再来深入地了解和学习这个叫做Jinja2地模板语法。

minstbe的博客 1678

使用Python进行Web开发:从Flask入门到实践

Flask是一个微框架(micro-framework),因为它保留了核心功能,但依然易于扩展。它使用了Werkzeug作为WSGI工具包,Jinja2作为模板引擎,非常适合于快速开发Web应用。

qq_36733270的博客 1265

Flask Web学习笔记 - 第3章 模板

这个模板利用Jinja2的模板继承机制,让程序扩展为一个具有基本页面结构的基模板,其中就有用来引入Bootstrap的元素。上述在模板中使用的{{ name }}结构表示一个变量,它是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取。要想在程序中集成Bootstrap,最简单的方法是使用一个名为Flask-Bootstrap的Flask扩展,简化集成的过程。· 左边的’name’表示参数名,就是模板中使用的占位符,右边的’name’是当前作用域中的变量,表示同名参数的值。

Emma's Blog 1035

【11天从零基础入门flask】第 3 章:模板

Flask 默认使用 Jinja2 作为模板引擎,它提供了强大的功能,可以帮助你高效地处理模板中的变量、控制结构以及过滤器等。通过将变量传递给模板,我们能够根据不同的数据生成个性化的网页。通过本章的学习,您已经掌握了如何使用 Flask 和 Jinja2 创建动态 Web 页面,下一章将介绍如何处理静态文件,如 CSS 和 JavaScript,进一步增强页面的交互性和外观。页面上的内容根据传递的数据动态变化,无需手动编写重复的 HTML 代码。这些数据将在渲染模板时传递给模板引擎,从而动态填充页面内容。

qq_17405059的博客 1049

★Python轻量级Web框架Flask(2)——Flask模板渲染/Flask项目拆分模板

1、执行说明:首先程序会在app.py中开始执行,执行中第一步会将App这个包导入,然后就会执行App中的__init __.py文件,然后会在__init __.py文件导包时,去执行views.py中的代码,然后从views.py中导包时,进入到models.py中。

sz1125218970的博客 1462

Flask Web 开发全攻略:3 个步骤教你玩转路由与模板

在当今的数字化时代,Web 开发已经成为编程领域中最热门的技能之一。无论是构建个人博客、电商平台还是企业级应用,掌握一个简单易用的 Web 框架都能让你事半功倍。Flask,作为 Python 生态系统中一个轻量级的 Web 框架,以其简洁性和灵活性受到广大开发者的喜爱。本文将带你从零开始,学习Flask 框架的安装与使用创建简单的 Web 应用,以及路由与模板引擎的核心知识。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供清晰的操作步骤和实用示例,助你快速入门 Web 开发!

吴师兄大模型的博客 1047

3.3.3-Flask - 模板渲染【多选一:Flask系列】

【代码】3.3.3-Flask - 模板渲染【多选一:Flask系列】

sex2004803的博客 1226
上一篇: AI炼丹炉专栏
下一篇: 记一次:django models到sqlalchemy models重构
github_38596081
博客等级 码龄10年 40粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值