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