Python中学习Flask遇到问题:运行时报错 AttributeError: 'AnonymousUserMixin' object has no attribute 'can'
视图函数部分代码(如果删去 current_user.can(Permission.WRITE_ARTICLES) and 部分能运行)
@main.route(’/’, methods=[‘GET’, ‘POST’])
def index():
form = PostForm()
if current_user.can(Permission.WRITE_ARTICLES) and form.validate_on_submit():
post = Post(body=form.body.data,
author=current_user._get_current_object())
db.session.add(post)
db.session.commit()
return redirect(url_for(’.index’))
page = request.args.get(‘page’, 1, type=int)
model 部分代码:
class AnonymousUser(AnonymousUserMixin):
def can(self, permissions):
return False
def is_administrator(self):
return False
login_manager.anonymous_user = AnonymousUser
Python中学习Flask遇到问题:运行时报错 AttributeError: ‘AnonymousUserMixin’ object has no attribute ‘can’
这个错误通常是因为你在视图或模板中使用了 current_user.can() 方法,但当前用户是匿名用户(未登录)。AnonymousUserMixin 是 Flask-Login 为未登录用户提供的对象,默认没有 can 属性。
解决方案:
- 检查用户是否已登录:在使用
current_user.can()之前,确保用户已登录。 - 为匿名用户添加默认权限:可以自定义一个匿名用户类,为其添加
can方法并返回False。
代码示例:
from flask import Flask
from flask_login import LoginManager, UserMixin, AnonymousUserMixin, current_user
from functools import wraps
app = Flask(__name__)
app.secret_key = 'your-secret-key'
login_manager = LoginManager(app)
# 自定义匿名用户类
class AnonymousUser(AnonymousUserMixin):
def can(self, permission):
return False # 匿名用户默认没有任何权限
login_manager.anonymous_user = AnonymousUser
# 用户模型
class User(UserMixin):
def __init__(self, id, permissions=None):
self.id = id
self.permissions = permissions or []
def can(self, permission):
return permission in self.permissions
# 用户加载回调
@login_manager.user_loader
def load_user(user_id):
# 这里根据实际情况从数据库加载用户
if user_id == '1':
return User('1', ['admin'])
return None
# 权限检查装饰器
def permission_required(permission):
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.can(permission):
return '没有权限', 403
return f(*args, **kwargs)
return decorated_function
return decorator
@app.route('/admin')
@permission_required('admin')
def admin_page():
return '管理员页面'
if __name__ == '__main__':
app.run(debug=True)
关键点:
- 通过
login_manager.anonymous_user = AnonymousUser设置自定义的匿名用户类 - 匿名用户的
can()方法始终返回False - 使用
@permission_required装饰器进行权限检查 - 在模板中使用时也要先检查
current_user.is_authenticated
总结: 确保在调用权限方法前用户已登录或匿名用户有相应的 can 方法。
我不懂 flask,但看你的报错我猜 current_user 是 AnonymousUserMixin 的实例,而不是 AnonymousUser,但是 current_user 在哪里声明的你又没有贴出来,迷真的很迷。。。。
current_user 是从 flask_login 模块导入的,搞不懂我添加了 AnonymousUser 类,继承了 AnonymousUserMixin,添加了 can 方法,current_user 应该是 AnonymousUser 的实例,搞不懂。。。

