目录
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 页面。