Flask第一个应用 #
一、Hello World #
1.1 最简单的Flask应用 #
创建 app.py 文件:
python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, Flask!'
if __name__ == '__main__':
app.run()
1.2 运行应用 #
bash
# 方式1:直接运行Python文件
python app.py
# 方式2:使用flask命令
export FLASK_APP=app.py
flask run
# 方式3:指定主机和端口
flask run --host=0.0.0.0 --port=8080
1.3 访问应用 #
打开浏览器访问 http://localhost:5000,你将看到:
text
Hello, Flask!
二、代码详解 #
2.1 导入Flask类 #
python
from flask import Flask
Flask类是Flask框架的核心,用于创建应用实例。
2.2 创建应用实例 #
python
app = Flask(__name__)
| 参数 | 说明 |
|---|---|
__name__ |
当前模块名,用于定位资源 |
| 返回值 | Flask应用实例 |
__name__ 的作用:
- 确定应用的根目录
- 找到模板和静态文件目录
- 正确处理相对路径
2.3 定义路由 #
python
@app.route('/')
def hello():
return 'Hello, Flask!'
| 部分 | 说明 |
|---|---|
@app.route('/') |
装饰器,将URL映射到函数 |
'/' |
URL路径,表示根路径 |
hello() |
视图函数,处理请求并返回响应 |
return |
返回的内容作为响应体 |
2.4 运行服务器 #
python
if __name__ == '__main__':
app.run()
| 参数 | 默认值 | 说明 |
|---|---|---|
| host | 127.0.0.1 | 监听地址 |
| port | 5000 | 监听端口 |
| debug | False | 调试模式 |
三、调试模式 #
3.1 开启调试模式 #
python
if __name__ == '__main__':
app.run(debug=True)
或使用环境变量:
bash
export FLASK_DEBUG=1
flask run
3.2 调试模式功能 #
| 功能 | 说明 |
|---|---|
| 自动重载 | 代码修改后自动重启服务器 |
| 调试器 | 错误时显示交互式调试界面 |
| 详细错误 | 显示完整的错误堆栈信息 |
3.3 调试模式示例 #
python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
# 故意制造错误
return 1 / 0
if __name__ == '__main__':
app.run(debug=True)
访问页面时会显示详细的错误信息,方便调试。
3.4 安全警告 #
python
# ⚠️ 调试模式在生产环境必须关闭!
# 调试模式允许执行任意代码,存在安全风险
# 生产环境配置
if __name__ == '__main__':
app.run(debug=False)
四、多个路由 #
4.1 添加多个路由 #
python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '首页'
@app.route('/about')
def about():
return '关于页面'
@app.route('/contact')
def contact():
return '联系方式'
if __name__ == '__main__':
app.run(debug=True)
4.2 路由规则 #
| URL | 视图函数 | 说明 |
|---|---|---|
/ |
index() | 根路径 |
/about |
about() | 关于页面 |
/contact |
contact() | 联系方式 |
五、动态路由 #
5.1 基本动态路由 #
python
@app.route('/user/<username>')
def show_user(username):
return f'用户: {username}'
访问 /user/zhangsan,显示:用户: zhangsan
5.2 类型转换器 #
python
# 字符串(默认)
@app.route('/user/<username>')
def show_user(username):
return f'用户: {username}'
# 整数
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'文章ID: {post_id}'
# 浮点数
@app.route('/price/<float:price>')
def show_price(price):
return f'价格: {price}'
# 路径(包含斜杠)
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
return f'路径: {subpath}'
# UUID
@app.route('/item/<uuid:item_id>')
def show_item(item_id):
return f'项目ID: {item_id}'
5.3 类型转换器列表 #
| 转换器 | 说明 | 示例 |
|---|---|---|
| string | 接受任何不包含斜杠的文本(默认) | /user/<string:name> |
| int | 接受正整数 | /post/<int:id> |
| float | 接受正浮点数 | /price/<float:p> |
| path | 类似string,但接受斜杠 | /path/<path:p> |
| uuid | 接受UUID字符串 | /item/<uuid:id> |
5.4 自定义转换器 #
python
from werkzeug.routing import BaseConverter
class ListConverter(BaseConverter):
def to_python(self, value):
return value.split(',')
def to_url(self, values):
return ','.join(str(v) for v in values)
app.url_map.converters['list'] = ListConverter
@app.route('/tags/<list:tags>')
def show_tags(tags):
return f'标签: {tags}'
访问 /tags/python,flask,web,显示:标签: ['python', 'flask', 'web']
六、HTTP方法 #
6.1 指定HTTP方法 #
python
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return '处理登录'
else:
return '显示登录表单'
6.2 不同方法的路由 #
python
# GET请求
@app.route('/users', methods=['GET'])
def get_users():
return '获取用户列表'
# POST请求
@app.route('/users', methods=['POST'])
def create_user():
return '创建用户'
# PUT请求
@app.route('/users/<int:id>', methods=['PUT'])
def update_user(id):
return f'更新用户 {id}'
# DELETE请求
@app.route('/users/<int:id>', methods=['DELETE'])
def delete_user(id):
return f'删除用户 {id}'
6.3 常用HTTP方法 #
| 方法 | 用途 |
|---|---|
| GET | 获取资源 |
| POST | 创建资源 |
| PUT | 更新资源(完整) |
| PATCH | 更新资源(部分) |
| DELETE | 删除资源 |
七、请求对象 #
7.1 导入request对象 #
python
from flask import request
7.2 获取请求信息 #
python
@app.route('/info')
def info():
# 请求方法
method = request.method
# 请求路径
path = request.path
# 请求头
headers = dict(request.headers)
# 查询参数
args = request.args
# 表单数据
form = request.form
# JSON数据
json_data = request.get_json()
return f'方法: {method}, 路径: {path}'
7.3 获取查询参数 #
python
@app.route('/search')
def search():
# 获取单个参数
keyword = request.args.get('q', '')
# 获取多个同名参数
tags = request.args.getlist('tag')
return f'搜索关键词: {keyword}, 标签: {tags}'
访问 /search?q=flask&tag=python&tag=web
7.4 获取表单数据 #
python
@app.route('/submit', methods=['POST'])
def submit():
username = request.form.get('username')
password = request.form.get('password')
return f'用户名: {username}'
7.5 获取JSON数据 #
python
@app.route('/api/data', methods=['POST'])
def api_data():
data = request.get_json()
if data is None:
return {'error': '无效的JSON数据'}, 400
return {'received': data}
八、响应对象 #
8.1 字符串响应 #
python
@app.route('/')
def index():
return 'Hello, Flask!'
8.2 元组响应 #
python
@app.route('/tuple')
def tuple_response():
# (响应体, 状态码)
return 'Not Found', 404
# (响应体, 状态码, 响应头)
@app.route('/headers')
def headers_response():
return 'Created', 201, {'X-Custom': 'Value'}
8.3 JSON响应 #
python
from flask import jsonify
@app.route('/json')
def json_response():
return jsonify({
'name': 'Flask',
'version': '3.0',
'status': 'success'
})
8.4 Response对象 #
python
from flask import Response
@app.route('/response')
def response_obj():
return Response(
'Custom Response',
status=200,
headers={'X-Custom': 'Header'}
)
九、重定向 #
9.1 基本重定向 #
python
from flask import redirect
@app.route('/old')
def old():
return redirect('/new')
@app.route('/new')
def new():
return '新页面'
9.2 使用url_for重定向 #
python
from flask import redirect, url_for
@app.route('/admin')
def admin():
return redirect(url_for('login'))
@app.route('/login')
def login():
return '登录页面'
9.3 带参数重定向 #
python
@app.route('/user/<username>')
def profile(username):
return f'用户: {username}'
@app.route('/go-home')
def go_home():
return redirect(url_for('profile', username='admin'))
十、完整示例 #
10.1 简单的用户管理 #
python
from flask import Flask, request, jsonify, redirect, url_for
app = Flask(__name__)
# 模拟数据库
users = {
1: {'id': 1, 'name': '张三', 'email': 'zhangsan@example.com'},
2: {'id': 2, 'name': '李四', 'email': 'lisi@example.com'},
}
# 首页
@app.route('/')
def index():
return '''
<h1>用户管理系统</h1>
<ul>
<li><a href="/users">用户列表</a></li>
<li><a href="/users/1">查看用户1</a></li>
</ul>
'''
# 用户列表
@app.route('/users')
def user_list():
return jsonify(list(users.values()))
# 用户详情
@app.route('/users/<int:user_id>')
def user_detail(user_id):
user = users.get(user_id)
if user:
return jsonify(user)
return jsonify({'error': '用户不存在'}), 404
# 创建用户
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
user_id = max(users.keys()) + 1
users[user_id] = {
'id': user_id,
'name': data.get('name'),
'email': data.get('email')
}
return jsonify(users[user_id]), 201
# 更新用户
@app.route('/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):
if user_id not in users:
return jsonify({'error': '用户不存在'}), 404
data = request.get_json()
users[user_id].update(data)
return jsonify(users[user_id])
# 删除用户
@app.route('/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):
if user_id not in users:
return jsonify({'error': '用户不存在'}), 404
del users[user_id]
return '', 204
if __name__ == '__main__':
app.run(debug=True)
十一、总结 #
11.1 核心要点 #
| 要点 | 说明 |
|---|---|
| 应用实例 | app = Flask(__name__) |
| 路由定义 | @app.route('/') 装饰器 |
| 运行服务器 | app.run(debug=True) |
| 动态路由 | <converter:name> 语法 |
| HTTP方法 | methods=['GET', 'POST'] |
| 请求对象 | request.args, request.form, request.get_json() |
| 响应类型 | 字符串、元组、JSON、Response对象 |
11.2 下一步 #
现在你已经创建了第一个Flask应用,接下来让我们学习 项目结构,了解如何组织更复杂的Flask项目!
最后更新:2026-03-28