Flask-admin 无法识别模型视图中的 current_user

2024-04-22

我在 Flask-admin 中创建了 ModelView,并希望为用户提供角色选择,以便只有管理员才能创建具有角色经理、管理员或用户的用户。用户不应该选择授予管理员权限或类似的权限。我正在尝试这段代码,但它给了我:

AttributeError:“NoneType”对象没有属性“is_authenticated”

class UserView(ModelView):
    column_exclude_list = ['logs', 'password_hash',]
    form_excluded_columns = ['logs']
    can_edit = True
    if login.current_user or current_user.is_authenticated:
        if login.current_user.role == 'a':
            form_choices = {
            'role': [ ('a', 'Admin'), ('m', 'Manager'), ('u', 'User') ]
            }
        if login.current_user.role == 'm':
            form_choices = {
        'role': [
            ('m', 'Manager'),
            ('u', 'User')
            ]
    }

任何帮助将不胜感激。


评估current_user总是返回一个NoneType除非它在 ​​Flask 应用程序上下文中。执行如下操作:

def get_user_roles():

    _roles = []
    
    if current_user and current_user.is_authenticated:
        if current_user.role == 'a':
            _roles =  [('a', 'Admin'), ('m', 'Manager'), ('u', 'User')]
        elif login.current_user.role == 'm':
            _roles = [('m', 'Manager'), ('u', 'User')]

    return _roles

class UserView(ModelView):

    form_choices = {
        'role' : get_user_roles
    }

单个文件示例。如果您在未登录的情况下运行此命令,您将在角色选择中仅看到“用户”角色:

requirements.txt

Babel==2.11.0
blinker==1.5
click==8.1.3
colorama==0.4.6
dnspython==2.2.1
email-validator==1.3.0
Flask==2.2.2
Flask-Admin==1.6.0
Flask-BabelEx==0.9.4
Flask-Login==0.6.2
Flask-Mail==0.9.1
Flask-Principal==0.4.0
Flask-SQLAlchemy==3.0.2
Flask-WTF==1.0.1
greenlet==2.0.1
idna==3.4
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
passlib==1.7.4
pytz==2022.6
speaklater==1.3
SQLAlchemy==1.4.44
Werkzeug==2.2.2
WTForms==3.0.1

app.py

import os
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
import click
from flask import Flask, current_app
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from flask_login import current_user, UserMixin, LoginManager
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
login_manager = LoginManager()


class User(db.Model, UserMixin):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)

    first_name = db.Column(db.Unicode(length=255), nullable=False)
    last_name = db.Column(db.Unicode(length=255), nullable=False, index=True)

    # Identification Data: email & password
    email = db.Column(db.Unicode(length=254), nullable=False, unique=True)
    password = db.Column(db.Unicode(length=255), nullable=False)
    active = db.Column(db.Boolean(), default=False)

    role = db.Column(db.Unicode(length=255), nullable=False)


@login_manager.user_loader
def load_user(user_id):
    return User.get(user_id)


basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)

app.config['SECRET_KEY'] = '123456790'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'database.db')

db.init_app(app)
login_manager.init_app(app)


@app.cli.command('create-database', short_help='Create sample database')
def create_database():

    """
        Create database
    """

    db.drop_all()
    db.create_all()

    users = [
        {
            'email': '[email protected] /cdn-cgi/l/email-protection',
            'first_name': 'Paul',
            'last_name': 'Cunningham',
            'password': generate_password_hash('pa$$word'),
            'active': True,
            'role': 'a',
        },
        {
            'email': '[email protected] /cdn-cgi/l/email-protection',
            'first_name': 'Jane',
            'last_name': 'Smith',
            'password': generate_password_hash('pa$$word'),
            'active': True,
            'role': 'm'
        },
    ]

    for user in users:
        _user_db = User(**user)
        db.session.add(_user_db)

    db.session.commit()


@app.route('/')
def index():  # put application's code here
    return '<a href="/admin/">Click me to get to Admin!</a>'


admin = Admin(app, template_mode="bootstrap3")


def get_user_roles():

    # default role is a user
    _roles = [('u', 'User')]

    if current_user and current_user.is_authenticated:
        if current_user.has_role('a'):
            print('Current user is an admin')
            _roles = [('a', 'Admin'), ('m', 'Manager'), ('u', 'User')]
        elif current_user.has_role('m'):
            print('Current user is a manager')
            _roles = [('m', 'Manager'), ('u', 'User')]

    print(f"Roles assigned to role choices: {_roles}")
    return _roles


class UserView(ModelView):

    column_list = ('first_name', 'last_name', 'email', 'role')

    form_columns = column_list

    form_choices = {
        'role': get_user_roles
    }


admin.add_view(UserView(User, db.session))


if __name__ == '__main__':
    app.run()

运行以下命令来初始化 SQLite 数据库。

flask create-database
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask-admin 无法识别模型视图中的 current_user 的相关文章

  • Sqlalchemy 返回 SELECT 命令的不同结果(query.all)

    我有网络服务器 512 RAM FLASK SQLAlchemy SQLite gt uWSGI gt Nginx 问题 Sqlalchemy 返回 SELECT 命令 query all 的不同结果 Example 在数据库中添加了一些记
  • Python Flask Cors 问题

    我对 Python 有点陌生 但在使用 Node 应用程序时遇到了同样的问题 我正在向本地 Python 服务器发出一个非常标准的 jQuery AJAX 请求 init function callback var token config
  • sqlalchemy 中如何左外连接?

    我想在 sqlalchemy 中实现左外连接 sql查询是这样的 select from skills left join user skill on user skill skill id skills id and user skill
  • 声明图像字段的正确方法,sqlalchemy

    我正在尝试使用 Flask 构建和应用程序 我看过一些教程和书籍以及一些代码 1 它们解释了如何为数据库设置声明整数和字符串 然而 他们没有解释如何存储图像 我现在很困惑 虽然存储图像的自然方法是在数据库中 但阅读 Flask 站点上的一些
  • 模型无法通过烧瓶迁移检测到

    我的烧瓶应用程序中有这棵树 api migrations model init py Persons py Comments py other classes py resources init py app py util py This
  • Flask-admin 无法识别模型视图中的 current_user

    我在 Flask admin 中创建了 ModelView 并希望为用户提供角色选择 以便只有管理员才能创建具有角色经理 管理员或用户的用户 用户不应该选择授予管理员权限或类似的权限 我正在尝试这段代码 但它给了我 AttributeErr
  • Flask 中的动态导航

    我有一个在 Flask 中工作的非常简单的网站 它全部由 sqlite 数据库提供支持 每个页面都作为页表中的一行存储 其中包含路径 标题 内容等内容 该结构是分层的 其中页面可以有父级 例如 虽然 关于 可能是一个页面 但也可能有 关于
  • 带有 Flask 服务器的面向对象 Python?

    我正在使用 Flask 将一些数据处理代码公开为 Web 服务 我想要一些我的 Flask 函数可以访问的类变量 让我带你看看我被困住的地方 from flask import Flask app Flask name class MySe
  • 使用 Flask-Login 在 Flask 中获取“str”对象没有属性“is_authenticated”

    我正在尝试使用 Flask Login 设置 Flask 登录 我有一个供用户使用的 CouchDB 客户文档有一个称为 用户 的对象 class User UserMixin def init self user self name us
  • 如何从 Flask 调用另一个 Web 服务 api

    我在 Flask 服务器中使用重定向来调用另一个 Web 服务 api e g app route hello def hello return redirect http google com 网址逻辑上会更改为 google com 但
  • 视频背景和按钮 - 移动

    我已经建立了this app http finnfrotscher pythonanywhere com on Flask 目前没有移动支持 由于视频加载时间相当长 因此我希望在手持设备上打开页面时提供相同的视频 但具有不同的分辨率 剪辑和
  • 跳过一个端点的 Flask 日志记录?

    我有一个 Python Flask 应用程序 有一项运行状况检查经常访问一个端点 但我不想在日志中看到它 如何仅禁用一个 GET 端点的日志记录 而保留其他所有端点的日志记录 艾蒂安 贝尔萨克为我指明了正确的方向 这就是我的实现方式 fro
  • 如何将 html 输入到 Flask 中?

    我有这个 html 位
  • 将 Flask_login 会话与 jinja2 模板一起使用

    我有简单的 jinja2 模板 带有注册 登录链接 我应该在用户登录时隐藏它们 我还使用flask login 模块来处理这个东西 问题是 我应该如何识别用户是否已登录 jinja2 模板 Flask Login 添加了current us
  • 使用单个 shell 脚本运行 React 和 Flask

    我构建了一个使用 ReactJS 作为前端和 Flask 作为中间件的应用程序 我可以使用以下命令序列来执行它 npm start cd Equation Solver python m flask run 执行第一个命令后 我必须打开另一
  • 使用 gevent 在应用程序上下文之外工作的 Flask 蓝图

    我正在尝试通过 Flask mail 使用 gevent 在 Flask 中异步发送电子邮件 我正在 在应用程序上下文之外工作 我知道 app app context 但我无法让它与我的设置一起使用 我的应用程序是使用这样的应用程序工厂创建
  • 如何将 Jinja 与 Twisted 一起使用?

    我正在计划使用 Python 与 Twisted Storm 和 Jinja 一起开发一个讨论软件 问题是 Jinja 不是为 Twisted 或异步套接字库而设计的 并且使用 Twisted 提供的性能是我不打算使用 Flask 的原因
  • 如何将Python + Flask变量输入到html标签属性中

    顺便说一句 新手 我正在使用 Python Flask 我有一个 Python 变量 我想将其替换为value 我的尝试 value variable 没用
  • sqlalchemy:无法在拆卸时删除数据库

    我正在尝试使用 pytest 进行 sqlalchemy 但遇到以下问题 pytest fixture scope function def my session my db request from my models import Se
  • 在 FlaskForm (WTForms) 中传递并使用变量

    该代码非常不言自明 我想将一个变量传递给FlaskForm子类以供进一步使用 from flask import Flask render template string from flask wtf import FlaskForm fr

随机推荐