flask之常见装饰器

目录

1. app.route装饰器

2. app.before_request装饰器

3. app.after_request装饰器

4. app.errorhandler装饰器

5. login_required装饰器(自定义用于用户登录验证)


1. app.route装饰器

from flask import Flask

app = Flask(__name__)

@app.route('/')

def index():

    return "Hello, World!"

在上述代码中:

首先创建了一个 Flask 应用实例 app。

然后通过 @app.route('/') 装饰器将 index 函数绑定到了网站的根路径 '/' 上。当用户访问应用的根路径(比如在本地运行时访问 http://localhost:5000/,假设应用运行在 5000 端口)时,index 函数就会被调用,进而返回 "Hello, World!" 作为响应内容展示给用户。

2. app.before_request装饰器

from flask import Flask, request

app = Flask(__name__)

@app.before_request

def before_request():

    print(f"Received a request to {request.path}")

@app.route('/')

def index():

    return "Hello, World!"

这里:

同样先创建了 app 实例。

@app.before_request 装饰器修饰的 before_request 函数会在每个请求被处理之前执行。在这个函数里,通过 print(f"Received a request to {request.path}") 可以打印出接收到的请求所对应的路径信息,这样就能知道有哪些请求到达了应用,在请求真正被路由到具体的视图函数(如这里的 index 函数)之前就可以获取到这些请求相关的信息。

3. app.after_request装饰器

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')

def index():

    return "Hello, World!"

@app.after_request

def after_request(response):

    response.headers['X-Custom-Header'] = 'This is a custom header'

    return response

在这段代码中:

先创建好 app 并定义了 index 函数绑定到根路径。

@app.after_request 装饰器修饰的 after_request 函数会在每个请求被视图函数处理之后、返回响应给客户端之前执行。在这个函数里,通过 response.headers['X-Custom-Header'] = 'This is a custom header' 给响应对象添加了一个名为 X-Custom-Header 的自定义头部信息,然后再将修改后的响应返回给客户端,这样客户端接收到的响应就带有了这个自定义的头部。

4. app.errorhandler装饰器

from flask import Flask



app = Flask(__name__)

@app.errorhandler(404)

def page_not_found(error):

    return "Oops! The page you are looking for does not exist.", 404

@app.route('/')

def index():

    return "Hello, World!"

此代码中:

创建了 app 实例后,通过 @app.errorhandler(404) 装饰器定义了 page_not_found 函数来处理 404 错误(即页面不存在的情况)。当用户访问一个不存在的页面时,Flask 会触发 404 错误处理机制,此时 page_not_found 函数就会被调用,它会返回 "Oops! The page you are looking for does not exist." 这样的自定义错误消息以及 404 状态码给客户端。

5. login_required装饰器(自定义用于用户登录验证)

from flask import Flask, session, redirect, url_for



app = Flask(__name__)

app.config['SECRET_KEY'] = 'a_secret_key'

def login_required(f):

    def wrapper(*args, **kwargs):

        if 'user_id' not in session:

            return redirect(url_for('login'))

        return f(*args, **kwargs)

    return wrapper

@app.route('/login')def login():

    session['user_id'] = 1  # 模拟登录成功设置用户ID

    return "You are logged in."

@app.route('/protected')

@login_required

def protected():

    return "This is a protected page. Only logged-in users can see it."

在这个示例中:

首先创建了 app 实例并设置了 SECRET_KEY。

然后定义了一个自定义的 login_required 装饰器。它内部定义了一个 wrapper 函数,在这个函数里,先通过 if 'user_id' not in session 检查 user_id 是否存在于 session 中,如果不存在就通过 return redirect(url_for('login')) 将用户重定向到 login 页面;如果存在就调用被装饰的函数(如这里的 protected 函数)。

接着定义了 login 函数用于模拟登录操作,设置了 session['user_id'] = 1 来表示登录成功。

最后通过 @login_required 装饰了 protected 函数,这就使得只有当用户登录(即 user_id 存在于 session 中)后才能访问 protected 页面,否则会被重定向到 login 页面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值