Flask 快速入门:路由、视图函数、模板与 Jinja2 详解

小飞兽 Flask 10 次阅读 2026-07-29

Flask 是 Python 生态中最受欢迎的轻量级 Web 框架,以其简洁、灵活、可扩展性强著称。相比 Django 的大而全,Flask 主张微核哲学,核心只处理请求调度和模板渲染,数据抽象层、表单验证等功能全部交给扩展实现。本文带你从零掌握 Flask 的核心概念:路由注册、视图函数、模板引擎 Jinja2,以及请求上下文、闪现消息等常用特性。

一、Flask 核心概念

Flask 通过 app.route() 装饰器将 URL 绑定到 Python 函数,该函数称为视图函数(View Function),返回值即客户端收到的 HTTP 响应体。Flask 自动重载(debug 模式)在修改代码后无需重启服务,极大提升开发效率。

二、基础路由与视图函数

from flask import Flask, render_template, request, session, flash, redirect, url_for

app = Flask(__name__)
app.secret_key = 'your-secret-key-here'

@app.route('/')
def index():
return '

Welcome to Flask!

这是一个简洁而强大的 Python Web 框架。

'

@app.route('/user//')
def user_profile(username):
return f'

用户资料

用户名:{username}

'

@app.route('/post//')
def get_post(post_id):
posts = {1: 'Flask 入门教程', 2: 'Django vs Flask', 3: 'RESTful API 设计'}
title = posts.get(post_id, '未找到文章')
return f'

文章 #{post_id}

{title}

'

@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username', '')
password = request.form.get('password', '')
if username and password:
session['user'] = username
flash(f'登录成功,欢迎 {username}!', 'success')
return redirect(url_for('.index'))
flash('用户名或密码错误', 'error')
return '

'

@app.route('/logout')
def logout():
session.pop('user', None)
flash('已退出登录', 'info')
return redirect(url_for('.index'))

@app.route('/hello//')
def hello(name):
tasks = ['完成 Flask 入门', '学习 Django', '部署生产环境']
return render_template('hello.html', name=name, tasks=tasks, title='Flask 模板示例')

if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)

三、Jinja2 模板语法

Jinja2 是 flask 内置的模板引擎,支持变量替换、条件判断、循环、过滤器、模板继承等强大功能。

<!-- templates/hello.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>{{ title }}</title></head>
<body>
<h1>你好,{{ name }}!</h1>
{% if session.get('user') %}
<p>当前用户:{{ session.user }} | <a href="{{ url_for('.logout') }}">退出</a></p>
{% else %}
<p><a href="{{ url_for('.login') }}">登录</a></p>
{% endif %}
<h2>任务列表</h2>
<ul>{% for task in tasks %}
<li{% if loop.first %} style="color:green"{% endif %}>{{ loop.index }}. {{ task }}</li>
{% else %}<li>暂无任务</li>{% endfor %}</ul>
<p>任务数量:{{ tasks|length }}</p>
<p>首任务大写:{{ tasks[0]|upper }}</p>
{% extends 'base.html' %}
{% block content %}<p>这里是自定义内容块</p>{% endblock %}
</body>
</html>

四、常见问题

Q1:Flask 返回 JSON 怎么写?
使用 jsonify() 函数,它会自动设置 Content-Type: application/json 并序列化字典为 JSON 字符串。直接返回字典也可以(Flask 1.1+ 支持),但推荐显式使用 jsonify() 以确保响应头正确。

Q2:如何处理 404/500 错误?
使用 @app.errorhandler(404)@app.errorhandler(500) 装饰器注册自定义错误页面,返回 render_template() 即可。

Q3:session 和 cookie 是什么关系?
Flask 的 session 将数据加密后存储在客户端 cookie 中,服务器通过密钥签名验证完整性。必须设置 app.secret_key,且密钥要足够随机且保密,否则攻击者可伪造 session。

五、延伸阅读