Python 烧瓶管理&x2B;(烧瓶登录和/或烧瓶负责人)

Python 烧瓶管理&x2B;(烧瓶登录和/或烧瓶负责人),python,plugins,import,flask,Python,Plugins,Import,Flask,身份验证和授权可以通过Flask登录和Flask主体插件集成到Flask中。(或者也可能通过Flask安全插件。) 然而:Flask Admin——另一个提供后端仪表板的插件——并不是一个注册的蓝图……而且,我相信(据我所知),Flask Login和Flask Principal使用的装饰器——用户访问渲染视图时需要使用这些装饰器……这些装饰器仅对作为已注册蓝图一部分的视图进行操作 两个问题: 1) 如何在我的应用程序中将Flask Admin注册为蓝图,和/或以其他方式启用Flask登录和/

身份验证和授权可以通过Flask登录和Flask主体插件集成到Flask中。(或者也可能通过Flask安全插件。)

然而:Flask Admin——另一个提供后端仪表板的插件——并不是一个注册的蓝图……而且,我相信(据我所知),Flask Login和Flask Principal使用的装饰器——用户访问渲染视图时需要使用这些装饰器……这些装饰器仅对作为已注册蓝图一部分的视图进行操作

两个问题:

1) 如何在我的应用程序中将Flask Admin注册为蓝图,和/或以其他方式启用Flask登录和/或Flask主体装饰程序以保护与Flask Admin关联的视图

2) 为什么Flask Login和Flask Principal只在我的应用程序的“本机”部分的对象上工作……而不是从插件导入的对象(例如“Admin”对象)?如果我确实正确地认识到了这个问题,我该如何解决这个问题呢


我想这就是问题所在,因为为我的应用程序的主索引页创建受保护的视图……或者在蓝图中包含视图的任何其他页面,对我来说都不费吹灰之力。我似乎无法为Flask Admin index页面(同样,该页面没有蓝图)执行此操作。

Flask Admin提供了另一种提供身份验证的方法-您只需将
AdminIndex
BaseIndex
视图(或
contrib
中的视图,如果您只需要这些视图)子类化即可并实现
是可访问的
方法。有关更多详细信息,请参阅。存储库中还提供了。

如何将Flask Admin与Flask Principal一起使用的简单示例

from functools import partial
from flask.ext.admin import Admin as BaseAdmin, AdminIndexView
from flask.ext.principal import Permission, identity_loaded, Need
from flask.ext.security import current_user

PartnerAccessNeed = partial(Need, 'access')

class PartnerAccessPermission(Permission):
    def __init__(self, partner_id):
        need = PartnerAccessNeed(partner_id)
        super(PartnerAccessPermission, self).__init__(need)


@identity_loaded.connect
def on_post_identity_loaded(sender, identity):  
    if hasattr(current_user, 'partner'):
        identity.provides.add(PartnerAccessNeed(current_user.partner.id))

class PartnerAdminIndexView(AdminIndexView):

    def __init__(self, partner_id, *args, **kwargs):
        self.partner_id = partner_id
        super(PartnerAdminIndexView, self).__init__(*args, **kwargs)

    def is_accessible(self):

        if current_user.is_anonymous():
            return redirect(url_for_security('login'))

        if not current_user.is_partner():
            return False

        permission = PartnerAccessPermission(self.partner_id)

        if permission.can():    
            return True

        return False

class PartnerAdmin(BaseAdmin):
    def __init__(self, partner_id, endpoint, name, subdomain, *args, **kwargs):

        index = PartnerAdminIndexView(name=name, 
                                      endpoint=endpoint,
                                      url='/dashboard',
                                      partner_id=partner_id)

        super(PartnerAdmin, self).__init__(base_template='mcnm/master.html', index_view=index, subdomain=subdomain)
这是一个很好的示例,说明了如何和可以与flask admin连接


在本文中,样板作者简要介绍了实现逻辑。

谢谢Sean…为我提供了这篇文章的文档。我已经审查了它们,并试图实施它们……尽管没有效果。使用is_accessible方法就不必使用Flask登录来保护管理仪表板了?意思是:那么我不需要为任何Flask Admin视图的def使用Flask登录装饰器?我不得不说,在回购协议之外,文件对于Flask Admin的auth来说很薄。如果,在上述回购协议之外,您碰巧遇到了该解决方案的另一个公共实现……您很想知道。@Sean-您不需要Flask登录装饰程序,但需要使用Flask登录方法来验证用户身份。如果你看一下这个例子,你会发现管理员视图只有在当前用户经过身份验证的情况下才可以访问。如果未经身份验证的用户试图访问管理员视图,则应将其重定向到登录屏幕。您可以重新共享该示例吗?github已过期/无法工作。谢谢在
中返回重定向是可访问的
将被评估为True。那绝对不是你想要的!