首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Flask模板全解析

Flask模板全解析

作者头像
用户8589624
发布2025-11-15 19:19:31
发布2025-11-15 19:19:31
220
举报
文章被收录于专栏:nginxnginx

Flask模板全解析

一、模板渲染基础

1.1 为什么需要模板引擎

在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题:

  • 代码难以维护
  • 前后端耦合严重
  • 无法复用HTML组件
  • 缺乏逻辑控制能力

Flask内置了Jinja2模板引擎,完美解决了这些问题。

1.2 第一个模板渲染示例

首先创建项目结构:

代码语言:javascript
复制
myapp/
├── app.py
└── templates/
    └── index.html

app.py内容:

代码语言:javascript
复制
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    user = {'username': '张三', 'age': 25}
    posts = [
        {'title': '第一篇', 'content': '内容1'},
        {'title': '第二篇', 'content': '内容2'}
    ]
    return render_template('index.html', user=user, posts=posts)

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

templates/index.html内容:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <title>{{ user.username }}的主页</title>
</head>
<body>
    <h1>欢迎, {{ user.username }}!</h1>
    <p>年龄: {{ user.age }}</p>
    
    <h2>文章列表</h2>
    <ul>
        {% for post in posts %}
        <li>{{ post.title }} - {{ post.content }}</li>
        {% endfor %}
    </ul>
</body>
</html>
1.3 模板渲染原理

render_template()函数的工作流程:

  1. 在templates目录查找指定模板文件
  2. 解析模板中的变量和逻辑
  3. 将上下文变量传入模板
  4. 生成最终HTML响应

二、模板访问对象属性

2.1 访问字典属性
代码语言:javascript
复制
<p>用户名: {{ user['username'] }}</p>
<p>年龄: {{ user.get('age', 18) }}</p>  <!-- 带默认值 -->
2.2 访问对象属性

假设我们有一个User类:

代码语言:javascript
复制
class User:
    def __init__(self, username, email):
        self.username = username
        self.email = email

模板中可以这样访问:

代码语言:javascript
复制
<p>用户名: {{ user.username }}</p>
<p>邮箱: {{ user.email }}</p>
2.3 访问列表和元组
代码语言:javascript
复制
<p>第一篇文章: {{ posts[0].title }}</p>
<p>最后一篇文章: {{ posts[-1].title }}</p>
2.4 特殊变量访问
代码语言:javascript
复制
<p>当前时间: {{ config.DEBUG }}</p>  <!-- 访问Flask配置 -->
<p>请求方法: {{ request.method }}</p>  <!-- 访问请求对象 -->
<p>会话信息: {{ session.get('user_id') }}</p>
<p>闪现消息: {{ get_flashed_messages() }}</p>

三、过滤器的使用

3.1 内置过滤器大全

Jinja2提供了丰富的内置过滤器:

代码语言:javascript
复制
<!-- 字符串处理 -->
<p>{{ "hello"|capitalize }}</p>  <!-- Hello -->
<p>{{ "HELLO"|lower }}</p>  <!-- hello -->
<p>{{ "hello world"|title }}</p>  <!-- Hello World -->
<p>{{ "hello"|replace("e", "a") }}</p>  <!-- hallo -->

<!-- 列表处理 -->
<p>{{ [1,2,3]|length }}</p>  <!-- 3 -->
<p>{{ [1,2,3]|first }}</p>  <!-- 1 -->
<p>{{ [1,2,3]|last }}</p>  <!-- 3 -->
<p>{{ [1,2,3]|join("|") }}</p>  <!-- 1|2|3 -->

<!-- 数值处理 -->
<p>{{ 3.1415926|round(2) }}</p>  <!-- 3.14 -->
<p>{{ 1000|filesizeformat }}</p>  <!-- 1000 Bytes -->
<p>{{ 0.85|float }}</p>  <!-- 0.85 -->

<!-- 日期处理 -->
<p>{{ user.create_time|datetimeformat }}</p>
<p>{{ user.create_time|datetimeformat('%Y-%m-%d') }}</p>

<!-- HTML处理 -->
<p>{{ "<script>alert(1)</script>"|escape }}</p>
<p>{{ "Markdown text"|markdown }}</p>
<p>{{ "https://example.com"|urlencode }}</p>
3.2 自定义过滤器

在app.py中注册自定义过滤器:

代码语言:javascript
复制
@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

@app.template_filter('format_phone')
def format_phone(phone):
    return f"{phone[:3]}-{phone[3:7]}-{phone[7:]}"

模板中使用:

代码语言:javascript
复制
<p>{{ "hello"|reverse }}</p>  <!-- olleh -->
<p>{{ "13812345678"|format_phone }}</p>  <!-- 138-1234-5678 -->
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Flask模板全解析
    • 一、模板渲染基础
      • 1.1 为什么需要模板引擎
      • 1.2 第一个模板渲染示例
      • 1.3 模板渲染原理
    • 二、模板访问对象属性
      • 2.1 访问字典属性
      • 2.2 访问对象属性
      • 2.3 访问列表和元组
      • 2.4 特殊变量访问
    • 三、过滤器的使用
      • 3.1 内置过滤器大全
      • 3.2 自定义过滤器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档