Python Flask中如何在main蓝本外引入@login_required装饰器
main/views.py
from flask_login import login_required
@login_required
@main.route(’/upload’, methods=[‘GET’, ‘POST’])
def upload():
…
Python Flask中如何在main蓝本外引入@login_required装饰器
在Flask应用中,@login_required装饰器通常与Flask-Login扩展一起使用。如果你想在main蓝图之外的其他地方(例如另一个独立的蓝图,或者直接在应用实例上)使用它,关键是要确保装饰器能访问到正确的login_manager实例和当前用户对象。
这里有两种常见情况,我都给出完整示例:
情况1:在另一个蓝图中使用
假设你有一个main蓝图和一个api蓝图,你想在api蓝图的视图函数上使用@login_required。
# app/__init__.py 或主应用文件
from flask import Flask
from flask_login import LoginManager, login_required, current_user
login_manager = LoginManager()
login_manager.login_view = 'main.login' # 指定登录视图
def create_app():
app = Flask(__name__)
app.secret_key = 'your-secret-key'
login_manager.init_app(app)
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .api import api as api_blueprint
app.register_blueprint(api_blueprint, url_prefix='/api')
return app
# 用户加载器(必须设置)
@login_manager.user_loader
def load_user(user_id):
from .models import User # 根据你的模型导入
return User.query.get(int(user_id))
# app/api/__init__.py 或 api 蓝图文件
from flask import Blueprint, jsonify
from flask_login import login_required, current_user
api = Blueprint('api', __name__)
# 直接在api蓝图的视图上使用装饰器
@api.route('/profile')
@login_required # 这里可以正常使用
def api_profile():
# current_user 在这里可用
return jsonify({'username': current_user.username})
@api.route('/admin')
@login_required
def admin_data():
# 你还可以添加自定义的角色检查
if not current_user.is_admin:
return jsonify({'error': 'Forbidden'}), 403
return jsonify({'data': 'sensitive admin info'})
情况2:在应用根路由上使用
如果你想直接在应用实例(而不是蓝图)上定义路由并使用@login_required,方法完全一样:
# app.py
from flask import Flask, render_template
from flask_login import LoginManager, login_required, current_user
app = Flask(__name__)
app.secret_key = 'secret-key'
login_manager = LoginManager(app)
login_manager.login_view = 'login'
# ... 设置 user_loader ...
# 直接在app上使用装饰器
@app.route('/dashboard')
@login_required # 这样用没问题
def dashboard():
return render_template('dashboard.html', user=current_user)
核心要点:
@login_required装饰器是全局的,它的可用性不依赖于特定的蓝图。只要LoginManager正确初始化并设置了user_loader,你可以在任何视图函数上使用它,无论是在主蓝图、其他蓝图还是应用根路由上。装饰器通过检查flask_login.current_user是否被设置(即是否匿名)来工作,如果用户未登录,它会将用户重定向到login_manager.login_view指定的端点。
总结: 装饰器是全局可用的,确保LoginManager正确初始化即可。
顺序错了?
from flask_login import login_required
.route(’/upload’, methods=[‘GET’, ‘POST’])
def upload():
…
是的,装饰器和路由位置反了

