Flask 中文教程

第四部分:实战项目篇
第12章 入门级实战:个人博客系统
第13章 进阶级实战:RESTful API 服务
第五部分:部署运维与优化篇
第14章 Flask 应用部署
第15章 性能优化与安全加固
第六部分:问题解决与进阶篇
第16章 常见问题与解决方案
第17章 Flask 进阶与扩展

5.1 模板基础使用

Flask模板入门指南:配置、渲染与变量传递

Flask 中文教程

本教程全面讲解Flask模板系统,涵盖模板基础使用、文件存放路径配置、render_template函数的渲染方法以及模板变量与上下文的传递技巧,适合初学者快速上手。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Flask模板系统:从基础到实践

引言

Flask是一个轻量级的Python Web框架,其模板系统基于Jinja2,允许开发者将HTML与Python代码分离,提高代码可维护性和可读性。本教程将详细介绍模板的基础使用、路径配置、渲染方法和变量传递,助您轻松掌握Flask模板。

1. 模板基础使用

什么是Flask模板?

模板是包含HTML和Jinja2语法(如变量和控制结构)的文件,用于动态生成网页内容。模板文件通常以.html扩展名保存,存放在templates文件夹中。

创建模板文件

在Flask项目中,创建一个名为templates的文件夹。然后,在该文件夹中添加一个模板文件,例如index.html

示例模板文件 templates/index.html

<!DOCTYPE html>
<html>
<head>
    <title>欢迎页面</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
    <p>这是您的第一个Flask模板。</p>
</body>
</html>

在上面的模板中,{{ name }}是一个模板变量,将在渲染时被替换为实际值。

基本模板语法

  • 变量:使用双大括号 {{ variable }} 插入变量。
  • 控制结构:如条件语句({% if condition %}...{% endif %})和循环({% for item in list %}...{% endfor %})。
  • 注释:使用 {# comment #} 添加注释。

示例:

{% if user %}
    <p>欢迎,{{ user.username }}!</p>
{% else %}
    <p>请登录。</p>
{% endif %}

2. 模板文件存放路径配置

默认模板路径

Flask默认在项目根目录下的templates文件夹中查找模板文件。例如,如果您的Flask应用文件app.py在项目根目录,那么Flask会自动从templates文件夹加载模板。

自定义模板路径

如果您想使用不同的文件夹存放模板,可以在创建Flask应用时指定template_folder参数。

示例:

from flask import Flask

# 指定模板文件夹为 'my_templates'
app = Flask(__name__, template_folder='my_templates')

在这个例子中,Flask将在my_templates文件夹中查找模板文件,而不是默认的templates文件夹。

注意

  • 确保自定义路径相对于项目根目录或绝对路径。
  • 如果模板路径不存在,Flask会抛出错误。

3. 模板渲染(render_template函数)

render_template函数概述

render_template是Flask提供的核心函数,用于渲染模板文件。它接受模板文件名和可选参数(如变量),并返回渲染后的HTML字符串。

基本用法

在Flask视图函数中,使用render_template来渲染模板。

示例代码:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    # 渲染 'index.html' 模板,并传递变量 'name'
    return render_template('index.html', name='Flask新手')

if __name__ == '__main__':
    app.run(debug=True)
  • render_template('index.html', name='Flask新手'):指定模板文件为index.html,并传递变量name的值为'Flask新手'
  • Flask会自动在templates文件夹中查找index.html文件,并将{{ name }}替换为'Flask新手'

传递多个变量

您可以传递任意数量的关键字参数作为变量。

示例:

@app.route('/user')
def user_page():
    user_info = {'name': 'Alice', 'age': 25}
    return render_template('user.html', user=user_info, title='用户信息')

在模板中,可以使用{{ user.name }}{{ title }}访问这些变量。

4. 模板变量与上下文传递

在模板中使用变量

如上所述,变量通过render_template传递到模板中,并在模板中用{{ variable }}语法访问。

上下文传递

Flask提供了上下文处理器,用于在多个模板中自动传递变量。上下文处理器是在请求周期内,将变量添加到模板上下文中的函数。

使用@app.context_processor

您可以定义一个函数,并使用@app.context_processor装饰器,使其在所有模板中可用。

示例:

from flask import Flask, render_template

app = Flask(__name__)

@app.context_processor
def inject_global_vars():
    # 这个函数返回的字典会添加到所有模板的上下文中
    return {
        'site_name': '我的Flask应用',
        'current_year': 2023
    }

@app.route('/')
def home():
    return render_template('home.html')

home.html模板中,可以直接使用{{ site_name }}{{ current_year }},而不需要在每次渲染时显式传递。

在模板中访问复杂数据结构

如果传递了字典或列表等复杂对象,可以在模板中使用点号或方括号语法访问嵌套属性。

示例:

@app.route('/product')
def product():
    product_data = {
        'name': '笔记本电脑',
        'price': 1000,
        'specs': ['16GB RAM', '512GB SSD']
    }
    return render_template('product.html', product=product_data)

在模板中:

<h2>{{ product.name }}</h2>
<p>价格: ${{ product.price }}</p>
<ul>
{% for spec in product.specs %}
    <li>{{ spec }}</li>
{% endfor %}
</ul>

总结

通过本教程,您应该掌握了Flask模板的基础使用,包括创建模板、配置路径、使用render_template函数渲染模板,以及传递变量和上下文。继续练习这些概念,您将能构建动态的Web应用。如有疑问,参考Flask官方文档或社区资源。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包