Flask常用装饰器详解:从基础路由到权限校验的实战应用

最常用的 Flask 装饰器
Flask 作为一个轻量级的 Python Web 框架,其核心设计理念之一就是大量使用装饰器。装饰器不仅让代码更加简洁优雅,还能将不同的功能模块(如路由、权限校验、错误处理等)巧妙地解耦。本文将详细介绍 Flask 开发中最常用的装饰器及其应用场景。

  1. @app.route — 路由装饰器
    这是 Flask 中最基础、使用频率最高的装饰器。它用于将一个 URL 规则绑定到一个视图函数上。当用户访问对应的 URL 时,Flask 就会调用被该装饰器修饰的函数。

from flask import Flask

app = Flask(name)

@app.route('/')
def index():
return 'Hello, Flask!'

@app.route('/user/')
def show_user_profile(username):
return f'User {username}'
2. @app.before_request — 请求前处理
该装饰器用于注册一个在每次请求发生之前执行的函数。它非常适合用于身份验证、权限检查、数据库连接初始化等前置逻辑。如果该函数返回了一个非None的值,请求将被中断,并直接返回该值作为响应。

@app.before_request
def check_login():
# 假设我们有一个检查用户是否登录的逻辑
if not session.get('user_logged_in') and request.endpoint != 'login':
return redirect(url_for('login'))
3. @app.after_request — 请求后处理
该装饰器注册的函数会在每次请求结束后执行,且必须接收一个响应对象作为参数,并返回一个响应对象。它常用于修改响应头(如添加 CORS 头信息)、记录日志或设置 Cookie。

@app.after_request
def add_cors_headers(response):
response.headers['Access-Control-Allow-Origin'] = 'www.ipipp.com'
response.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS'
return response
4. @app.teardown_request — 请求结束时清理
无论请求过程中是否抛出异常,被@app.teardown_request修饰的函数都会在请求上下文被销毁前执行。它主要用于资源的清理工作,如关闭数据库连接、释放文件句柄等。该函数接收一个异常对象作为参数,如果没有异常则为None。

@app.teardown_request
def close_db_connection(exception):
db = getattr(g, 'db', None)
if db is not None:
db.close()
5. @app.errorhandler — 错误处理
当应用抛出特定异常或遇到特定 HTTP 状态码时,可以使用该装饰器注册自定义的错误处理函数。这能让用户在遇到 404 或 500 错误时,看到更加友好的页面。

@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'), 404

@app.errorhandler(500)
def internal_server_error(error):
return render_template('500.html'), 500
6. @app.template_filter — 自定义模板过滤器
在 Jinja2 模板中,我们经常使用过滤器来格式化数据(如{{ name | capitalize }})。使用@app.template_filter可以轻松地在 Flask 中注册自定义的过滤器。

@app.template_filter('reverse')
def reverse_filter(s):
return s[::-1]

在模板中可以这样使用:{{ "hello" | reverse }}

  1. @app.context_processor — 上下文处理器
    在开发中,我们经常需要在所有模板中共享某些变量(如网站名称、当前登录用户信息等)。使用@app.context_processor装饰的函数,其返回值的字典内容将自动注入到所有模板的上下文中。

@app.context_processor
def inject_globals():
return dict(site_name='My Awesome Site', current_user=get_current_user())
8. 自定义装饰器 — 权限校验利器
除了 Flask 内置的装饰器,我们还可以结合functools.wraps编写自定义装饰器,以实现代码复用。例如,限制某些接口只能由管理员访问。

from functools import wraps
from flask import abort, session

def admin_required(f):
@wraps(f)
def decorated_function(args, **kwargs):
if not session.get('is_admin'):
abort(403) # Forbidden
return f(
args, **kwargs)
return decorated_function

@app.route('/admin/dashboard')
@admin_required
def admin_dashboard():
return 'Welcome to Admin Dashboard'
总结
Flask 的装饰器机制极大地增强了代码的可读性和可维护性。通过合理使用路由、请求钩子、错误处理以及自定义装饰器,开发者可以像搭积木一样构建出结构清晰、功能强大的 Web 应用。掌握这些最常用的装饰器,是迈向高效 Flask 开发的必经之路。
原文出自:https://www.ipipp.com/html/20260420/363.html

posted @ 2026-08-11 20:12  土豆啦  阅读(0)  评论(0)    收藏  举报