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’


3 回复

这个错误通常是因为你在视图或模板中使用了 current_user.can() 方法,但当前用户是匿名用户(未登录)。AnonymousUserMixin 是 Flask-Login 为未登录用户提供的对象,默认没有 can 属性。

解决方案:

  1. 检查用户是否已登录:在使用 current_user.can() 之前,确保用户已登录。
  2. 为匿名用户添加默认权限:可以自定义一个匿名用户类,为其添加 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 的实例,搞不懂。。。

回到顶部