Flask基本结构及核心概念【详细易懂 理解向】

1. Flask简介

Flask是一个轻量级的Python Web框架,它被称为"微框架",因为它保持核心简单但可扩展。

2. Flask的基本结构

最简单的Flask应用结构如下:

from flask import Flask

# 创建Flask应用实例
app = Flask(__name__)

# 路由装饰器和视图函数
@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run()

3. Flask的核心概念

3.1 路由(Routing)

路由是 Web 应用中的一个核心概念,它决定了不同的 URL 请求应该由哪个函数来处理。@app.route 是 Flask 中的路由装饰器,用来将 URL 路径和处理函数关联起来。

@app.route('/路径')
def 处理函数():
    return 响应内容
  1. 基本路由
@app.route('/')
def home():
    return '这是主页'

@app.route('/about')
def about():
    return '这是关于页面'
  1. 带参数的路由
# 路径参数
@app.route('/user/')
def show_user(username):
    return f'用户名是:{username}'

# 多个参数
@app.route('/post//')
def show_post(year, month):
    return f'显示{year}{month}月的文章'
  1. 指定请求方法
# 只接受POST请求
@app.route('/login', methods=['POST'])
def login():
    return '处理登录请求'

# 同时接受多种请求方法
@app.route('/user', methods=['GET', 'POST'])
def user():
    if request.method == 'POST':
        return '创建新用户'
    else:
        return '获取用户信息'

注意事项

  • 路由路径必须以斜杠(/)开头
  • 路由参数可以设置类型(string, int, float, path)
  • 同一个函数可以处理多个路由
  • 路由区分大小写
  • 结尾的斜杠很重要,有无斜杠被视为不同的路由
3.2 HTTP方法

Flask支持不同的HTTP请求方法:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return '处理登录请求'
    else:
        return '显示登录表单'
3.3 请求处理

处理来自客户端的数据:

from flask import request

@app.route('/submit', methods=['POST'])
def submit():
    # 获取表单数据
    username = request.form.get('username')
    password = request.form.get('password')
    return f'接收到数据:用户名={username}'
3.4 响应处理

返回不同类型的响应:

from flask import jsonify

@app.route('/api/data')
def get_data():
    data = {
        'name': '张三',
        'age': 25
    }
    return jsonify(data)  # 返回JSON响应

4. 实际案例

让我们看一个更完整的示例,一个简单的用户管理系统:

from flask import Flask, request, jsonify
from flask_cors import CORS

app = Flask(__name__)
CORS(app)  # 启用跨域支持

# 模拟数据库
users = {}

# 注册用户
@app.route('/api/users', methods=['POST'])
def register_user():
    try:
        data = request.json
        username = data.get('username')
        password = data.get('password')
        
        if username in users:
            return jsonify({
                "error": "用户已存在",
                "message": "该用户名已被注册"
            }), 400
            
        users[username] = {
            "password": password,
            "create_time": time.strftime("%Y-%m-%d %H:%M:%S")
        }
        
        return jsonify({
            "message": "注册成功",
            "data": {
                "username": username,
                "create_time": users[username]["create_time"]
            }
        })
        
    except Exception as e:
        return jsonify({
            "error": str(e),
            "message": "注册失败"
        }), 500

# 获取用户信息
@app.route('/api/users/', methods=['GET'])
def get_user(username):
    if username not in users:
        return jsonify({
            "error": "用户不存在",
            "message": "未找到该用户"
        }), 404
        
    return jsonify({
        "message": "获取成功",
        "data": {
            "username": username,
            "create_time": users[username]["create_time"]
        }
    })

if __name__ == '__main__':
    app.run(debug=True)

5. 重要特性

5.1 错误处理
@app.errorhandler(404)
def not_found(error):
    return jsonify({
        "error": "不存在",
        "message": "请求的资源不存在"
    }), 404
5.2 中间件

中间件(Middleware)是在请求到达视图函数之前或响应返回客户端之前执行的一段代码。它可以修改请求或响应,执行额外的操作(如身份验证、日志记录等)。
flask的中间件类型

from flask import Flask, request, g
import time
import logging

app = Flask(__name__)

# 1. before_request(请求前中间件)
@app.before_request
def before_request():
    # 记录请求开始时间
    g.start_time = time.time()
    # 记录请求信息
    logging.info(f"收到新请求:{request.path}")

# 2. after_request(请求后中间件)
@app.after_request
def after_request(response):
    # 计算请求处理时间
    duration = time.time() - g.start_time
    # 添加响应头
    response.headers['X-Request-Duration'] = str(duration)
    return response

# 3. teardown_request(请求结束后,即使发生异常也会执行)
@app.teardown_request
def teardown_request(exception):
    if exception:
        logging.error(f"请求处理发生错误: {str(exception)}")

6. 学习建议

  1. 从简单的路由开始,逐步添加更多功能
  2. 学习请求和响应的处理方式
  3. 理解HTTP方法(GET, POST, PUT, DELETE)
  4. 熟悉错误处理和日志记录
  5. 学习数据库集成(如SQLAlchemy)

7. 进阶主题

  • Flask蓝图(Blueprint)用于模块化应用
  • Flask-SQLAlchemy用于数据库操作
  • Flask-Login用于用户认证
  • Flask-RESTful用于构建REST API

你可能感兴趣的:(Flask基本结构及核心概念【详细易懂 理解向】)