当前位置: 首页 > article >正文

Flask中的装饰器

在 Flask 中,装饰器(Decorator)是一种 Python 语法特性,它允许你在不修改原始函数的情况下,扩展其功能。Flask 使用装饰器来定义路由、请求前后钩子、中间件等。


1. Flask 装饰器的基本概念

Python 的装饰器本质上是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。例如:

def my_decorator(f):
    def wrapper():
        print("调用前")
        f()
        print("调用后")
    return wrapper

@my_decorator
def say_hello():
    print("Hello, Flask!")

say_hello()

执行 say_hello() 时,输出:

调用前
Hello, Flask!
调用后

这里 @my_decorator 等价于 say_hello = my_decorator(say_hello)


2. Flask 中常见的装饰器

Flask 提供了一系列装饰器用于不同的功能,最常见的包括:

  • 路由装饰器
  • 请求前/后处理装饰器
  • 错误处理装饰器
  • Flask 扩展提供的装饰器

2.1 路由装饰器 @app.route

Flask 使用 @app.route 装饰器来注册 URL 路由,使某个函数在访问特定 URL 时被调用。

from flask import Flask

app = Flask(__name__)

@app.route('/')  # 访问根路径时执行
def home():
    return "欢迎来到 Flask 首页"

@app.route('/about')
def about():
    return "关于页面"

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

这里的 @app.route('/') 本质上是 app.add_url_rule('/', 'home', home) 的简化写法。


2.2 处理 HTTP 请求方法

默认情况下,@app.route 只允许 GET 请求,你可以使用 methods 参数指定多个方法:

@app.route('/submit', methods=['GET', 'POST'])
def submit():
    if request.method == 'POST':
        return "收到 POST 请求"
    return "收到 GET 请求"

2.3 @app.before_request & @app.after_request

Flask 允许你在每个请求处理之前或之后执行代码,可以用来做权限校验、日志记录等。

(1) @app.before_request

@app.before_request 在请求到达视图函数之前执行,适合用来验证权限、日志记录等。

from flask import request

@app.before_request
def before_request_func():
    print(f"正在处理请求: {request.path}")
(2) @app.after_request

@app.after_request 在视图函数执行后,返回响应之前执行,适合用来修改响应。

@app.after_request
def after_request_func(response):
    response.headers["X-Custom-Header"] = "FlaskDemo"
    return response

2.4 @app.errorhandler

用于处理特定的 HTTP 错误,例如 404、500。

@app.errorhandler(404)
def not_found_error(error):
    return "页面未找到", 404

3. 自定义 Flask 装饰器

除了 Flask 内置的装饰器,你也可以自定义装饰器,例如:检查用户是否登录。

from flask import request, jsonify

def login_required(f):
    def wrapper(*args, **kwargs):
        token = request.headers.get("Authorization")
        if not token:
            return jsonify({"error": "未授权"}), 401
        return f(*args, **kwargs)
    return wrapper

@app.route('/protected')
@login_required
def protected():
    return jsonify({"message": "成功访问受保护资源"})

当访问 /protected 时,如果请求头没有 Authorization,返回 401。


4. Flask 扩展中的装饰器

Flask 生态系统中的很多扩展也使用了装饰器,例如:

  • Flask-Login: @login_required
  • Flask-CORS: @cross_origin()
  • Flask-RESTful: @marshal_with()
  • Flask-Cache: @cache.cached(timeout=60)

示例(使用 Flask-Login 扩展):

from flask_login import login_required

@app.route('/dashboard')
@login_required
def dashboard():
    return "欢迎来到控制面板"

总结

  1. Flask 装饰器是基于 Python 高阶函数实现的,用于扩展功能。
  2. 常见的 Flask 内置装饰器:
    • @app.route:定义 URL 路由
    • @app.before_request:在请求前执行
    • @app.after_request:在请求后执行
    • @app.errorhandler:处理错误
  3. 可以自定义装饰器,用于认证、日志等功能。
  4. Flask 扩展提供的装饰器(如 @login_required)增强了 Flask 的能力。😃

http://www.kler.cn/a/588234.html

相关文章:

  • PHP优化技术
  • Kotlin知识体系(二) : Kotlin的七个关键特性
  • Vue项目上传到GitHub,vscode拉取vue项目更新后推送到GitHub上
  • 给easygui添加字体设置功能(tyysoft增强版)
  • 五子棋小游戏-简单开发版
  • docker部署DVWA-暴力破解-难度从low到impossible
  • 前缀和的例题
  • Android多线程通信机制
  • 开源WAF雷池本地化部署与远程查看网站安全防护的详细操作指南
  • Matlab 多输入系统极点配置
  • ChatGPT-4
  • 论文阅读笔记——QLORA: Efficient Finetuning of Quantized LLMs
  • ollama注册自定义模型(GGUF格式)
  • Python游戏开发自学指南:从入门到实践(第四天)
  • JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal
  • 我的创作纪念日--林戈的IT生涯-CSDN博客创作一年感想
  • 使用 `Express.js` 和 `better-sqlite3` 的最佳实践指南
  • 【Java】为在Azure容器应用中运行的Java应用捕获JVM堆转储
  • HTML5 drag API实现列表拖拽排序
  • Solana介绍