Flask核心功能入门教程:从零搭建轻量级Python Web应用
Flask作为Python生态中最受欢迎的轻量级Web框架,以“微框架”定位、灵活易扩展的特性,成为新手入门Web开发的首选。本文将从环境搭建到核心功能实战,手把手教你掌握Flask的核心用法,零基础也能快速上手。
一、前置准备:环境搭建与项目初始化
1. 安装Flask
Flask基于Python运行,首先确保你的电脑已安装Python(3.8及以上版本),然后通过pip安装Flask:
# 基础安装(推荐使用虚拟环境)
pip install flask
# 验证安装成功
python -c "import flask; print(flask.__version__)"
建议使用虚拟环境隔离项目依赖,避免全局环境冲突:
# 创建虚拟环境
python -m venv flask_demo
# 激活虚拟环境(Windows)
flask_demo\Scripts\activate
# 激活虚拟环境(Mac/Linux)
source flask_demo/bin/activate
# 激活后安装Flask
pip install flask
2. 第一个Flask应用
创建一个名为app.py的文件,写入以下代码,这是Flask最基础的应用结构:
# 导入Flask核心类
from flask import Flask
# 初始化Flask应用,__name__表示当前模块名,Flask以此定位资源路径
app = Flask(__name__)
# 定义路由:绑定URL路径与处理函数
@app.route('/')
def index():
# 视图函数:返回响应内容
return 'Hello, Flask! 这是我的第一个Flask应用'
# 启动应用(仅在直接运行该文件时生效)
if __name__ == '__main__':
# debug=True开启调试模式,代码修改后自动重启,开发环境专用
app.run(debug=True)
运行文件:
python app.py
打开浏览器访问http://127.0.0.1:5000/,即可看到“Hello, Flask! 这是我的第一个Flask应用”,标志着第一个Flask应用运行成功。
二、Flask核心功能详解
1. 路由与视图函数:URL与功能的映射
路由是Flask的核心,用于将URL路径映射到对应的处理函数(视图函数),是Web应用“请求-响应”的基础。
(1)基础路由定义
通过@app.route()装饰器定义路由,核心参数说明:
rule:URL路径,如/user;methods:允许的HTTP请求方法,默认['GET'],可指定['GET', 'POST']等。
示例:
from flask import Flask
app = Flask(__name__)
# 基础GET请求路由
@app.route('/about')
def about():
return '关于我们 - Flask入门教程'
# 支持GET和POST的路由
@app.route('/login', methods=['GET', 'POST'])
def login():
return '登录页面(支持GET/POST请求)'
if __name__ == '__main__':
app.run(debug=True)
(2)动态路由:传递URL参数
Flask支持在路由中定义动态参数,适配不同的请求场景:
# 动态路由:接收字符串参数
@app.route('/user/<username>')
def show_user(username):
# 接收URL中的username参数,返回个性化内容
return f'欢迎你,{username}!'
# 动态路由:接收数字参数(指定类型)
@app.route('/post/<int:post_id>')
def show_post(post_id):
# 仅匹配整数类型的post_id,非整数会返回404
return f'文章ID:{post_id},类型:{type(post_id)}'
# 运行测试:
# http://127.0.0.1:5000/user/张三 → 欢迎你,张三!
# http://127.0.0.1:5000/post/123 → 文章ID:123,类型:<class 'int'>
# http://127.0.0.1:5000/post/abc → 404错误
支持的动态参数类型:int(整数)、float(浮点数)、path(包含斜杠的字符串)。
2. 请求与响应:处理客户端数据
Web应用的核心是处理客户端请求(如表单、参数),并返回响应。Flask提供request对象封装请求数据,make_response定制响应。
(1)获取请求数据
首先导入request对象,常用属性:
request.args:获取URL查询参数(GET请求);request.form:获取表单数据(POST请求);request.method:获取当前请求方法。
示例:
from flask import Flask, request
app = Flask(__name__)
# 处理GET请求参数
@app.route('/search')
def search():
# 获取URL中的keyword参数,如/search?keyword=flask
keyword = request.args.get('keyword', '默认关键词')
return f'搜索关键词:{keyword}'
# 处理POST表单数据(模拟登录)
@app.route('/do_login', methods=['POST'])
def do_login():
# 获取表单中的用户名和密码
username = request.form.get('username')
password = request.form.get('password')
# 简单验证(实际开发需加密+数据库校验)
if username == 'admin' and password == '123456':
return '登录成功!'
else:
return '用户名或密码错误'
if __name__ == '__main__':
app.run(debug=True)
可通过Postman、curl或HTML表单测试POST请求:
<!-- 简单的登录表单(保存为login.html,放在项目根目录) -->
<form action="/do_login" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<button type="submit">登录</button>
</form>
(2)定制响应
默认视图函数返回字符串,也可返回状态码、响应头,或用make_response定制响应:
from flask import Flask, make_response
app = Flask(__name__)
# 基础响应:返回内容+状态码
@app.route('/404')
def not_found():
return '页面不存在', 404
# 定制响应头
@app.route('/custom_response')
def custom_response():
resp = make_response('自定义响应内容')
# 设置响应头
resp.headers['X-Developer'] = 'Flask入门'
resp.status_code = 200
return resp
if __name__ == '__main__':
app.run(debug=True)
3. 模板渲染:分离前端与后端
Flask集成Jinja2模板引擎,支持将动态数据渲染到HTML页面,实现前后端分离。
(1)模板文件存放规则
Flask默认读取项目根目录下的templates文件夹中的模板文件,先创建目录结构:
flask_demo/
├── app.py
└── templates/
└── index.html
(2)渲染模板示例
from flask import Flask, render_template
app = Flask(__name__)
# 渲染模板并传递动态数据
@app.route('/user/<name>')
def user_page(name):
# 向模板传递变量name和列表数据
hobbies = ['编程', '阅读', '跑步']
return render_template('index.html', username=name, hobbies=hobbies)
if __name__ == '__main__':
app.run(debug=True)
创建templates/index.html:
<!DOCTYPE html>
<html>
<head>
<title>Flask模板示例</title>
</head>
<body>
<h1>欢迎你,{{ username }}!</h1>
<p>你的爱好:</p>
<ul>
<!-- Jinja2循环语法 -->
{% for hobby in hobbies %}
<li>{{ hobby }}</li>
{% endfor %}
</ul>
<!-- Jinja2条件语法 -->
{% if username == 'admin' %}
<p>你是管理员用户</p>
{% else %}
<p>你是普通用户</p>
{% endif %}
</body>
</html>
访问http://127.0.0.1:5000/user/张三,即可看到渲染后的动态页面。
4. 静态文件:加载CSS/JS/图片
Flask默认读取static文件夹中的静态文件(CSS、JS、图片等),目录结构:
flask_demo/
├── app.py
├── templates/
│ └── index.html
└── static/
├── css/
│ └── style.css
└── img/
└── logo.png
在模板中引用静态文件:
<!-- index.html中添加 -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<img src="{{ url_for('static', filename='img/logo.png') }}" alt="logo">
5. 会话管理:Cookie与Session
(1)Cookie:客户端存储数据
from flask import Flask, make_response
app = Flask(__name__)
@app.route('/set_cookie')
def set_cookie():
resp = make_response('已设置Cookie')
# 设置Cookie,有效期30天
resp.set_cookie('user', 'flask_user', max_age=30*24*3600)
return resp
@app.route('/get_cookie')
def get_cookie():
# 获取Cookie
user = request.cookies.get('user', '未登录')
return f'当前Cookie中的用户:{user}'
(2)Session:服务端存储数据
Session基于加密的Cookie实现,需先设置秘钥:
from flask import Flask, session
app = Flask(__name__)
# 必须设置秘钥(生产环境需使用随机复杂字符串)
app.secret_key = 'your_secret_key_123456'
@app.route('/set_session')
def set_session():
# 存储Session数据
session['username'] = 'admin'
return 'Session已设置'
@app.route('/get_session')
def get_session():
# 获取Session数据
username = session.get('username', '未登录')
return f'当前登录用户:{username}'
@app.route('/clear_session')
def clear_session():
# 清除Session
session.pop('username', None)
return 'Session已清除'
三、Flask项目实战:简易待办事项应用
整合以上核心功能,搭建一个简易的待办事项(Todo)应用:
from flask import Flask, request, render_template, redirect, url_for, session
app = Flask(__name__)
app.secret_key = 'todo_demo_123'
# 初始化待办事项列表(模拟数据库)
if 'todos' not in session:
session['todos'] = []
# 首页:展示待办事项
@app.route('/')
def index():
todos = session.get('todos', [])
return render_template('todo.html', todos=todos)
# 添加待办事项
@app.route('/add', methods=['POST'])
def add_todo():
todo = request.form.get('todo')
if todo:
todos = session['todos']
todos.append(todo)
session['todos'] = todos # 更新session
return redirect(url_for('index')) # 重定向到首页
# 删除待办事项
@app.route('/delete/<int:index>')
def delete_todo(index):
todos = session['todos']
if 0 <= index < len(todos):
todos.pop(index)
session['todos'] = todos
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)
创建templates/todo.html:
<!DOCTYPE html>
<html>
<head>
<title>Flask待办事项</title>
<style>
.todo-item {margin: 10px 0; padding: 5px; border-bottom: 1px solid #eee;}
a {color: red; text-decoration: none; margin-left: 10px;}
</style>
</head>
<body>
<h1>Flask待办事项</h1>
<form action="/add" method="post">
<input type="text" name="todo" placeholder="输入待办事项" required>
<button type="submit">添加</button>
</form>
<div>
{% for todo in todos %}
<div class="todo-item">
{{ loop.index }}. {{ todo }}
<a href="/delete/{{ loop.index0 }}">删除</a>
</div>
{% else %}
<p>暂无待办事项</p>
{% endfor %}
</div>
</body>
</html>
运行后访问http://127.0.0.1:5000/,即可实现待办事项的添加、删除功能。
四、生产环境部署注意事项
- 关闭
debug=True:调试模式存在安全风险,生产环境必须关闭; - 使用WSGI服务器:如Gunicorn、uWSGI,替代Flask内置的开发服务器;
- 配置秘钥:生产环境使用随机、复杂的秘钥,可通过环境变量配置;
- 静态文件托管:生产环境建议用Nginx托管静态文件,提升性能。
示例:使用Gunicorn启动应用
# 安装Gunicorn
pip install gunicorn
# 启动应用(绑定0.0.0.0,端口8000)
gunicorn -w 4 -b 0.0.0.0:8000 app:app

浙公网安备 33010602011771号