Flask管理员自定义视图

时间:2016-04-02 10:15:06

标签: python-2.7 flask flask-admin

我是Flask / Flask-Admin的新手。 我已经按照了关于flask管理员的教程并设法使管理面板工作,但稍微失去了如何实现以下内容。 https://github.com/flask-admin/flask-admin/tree/master/examples/auth

  • 以普通用户身份登录时,我只能看到" home"页。 如何将其他视图公开给普通用户"并限制诸如只读等行动。

  • 我创建了一个" baseview"与以下任何其他模型无关:

class SitesView(MyBaseView):
    @expose('/')
    def index(self):
    return self.render('views/testviews.html')

admin.add_view(SitesView(name='Test views', endpoint='test views'))

和html如下:

{% extends 'admin/master.html' %}
{% block body %}
{{ super() }}
{% if current_user.has_role('view1') %}
<a href="#">Site1</a>
{% endif %}
{% if current_user.has_role('view2') %}
<a>Site2</a>
{% endif %}
{% if current_user.has_role('view3') %}
<a>Site3</a>
{% endif %}
{% if current_user.has_role('view4') %}
<a>Site4</a>
{% endif %}
{% endblock %}

这为我提供了一个新的标签,其中包含不同的视图,可以按预期工作。

我想在这里实现的是当用户点击Site1链接时,他们会转到flask-admin界面中的Site1页面,但我不知道该怎么做。我可以为此创建一条新路线,但问题是我无法(不知道如何)扩展烧瓶管理模板。

例如,这可行,但它将页面重定向到flask-admin模板:

@app.route('/views/')
def views():
    return render_template('views/views1.html')

并修改模板&gt; admin&gt; index.html页面,如下所示:

<ul class="lead text-center list-group">
    {% if current_user.has_role('view1') %}
        <li class="list-group-item"><a href="{{ url_for('views') }}">View1</a></li>
    {% endif %}
    {% if current_user.has_role('view2') %}
        <li class="list-group-item"><a href="#">View2</a></li>
    {% endif %}
    {% if current_user.has_role('view3') %}
        <li class="list-group-item">View3</li>
    {% endif %}
    {% if current_user.has_role('view4') %}
        <li class="list-group-item">View4</li>
    {% endif %}
</ul

我想使用flask管理员构建整个网站,以便我可以保持用户体验的一致性。我这样做是错误的吗?

感谢您的时间。

如果您希望我提供有关此问题的更多信息,请告诉我。

亲切的问候。

2 个答案:

答案 0 :(得分:0)

因此,在完成文档和教程之后,我找到了解决问题的方法 对于我的第一个问题:

  

以普通用户身份登录时,我只能看到&#34; home&#34;页。我怎么能够   将其他观点暴露给普通用户&#34;并限制阅读等操作   只有等等。

我们可以通过覆盖我们的视图函数is_accessible方法来实现,如下所示:

def is_accessible(self):
    if not current_user.is_active or not current_user.is_authenticated:
        return False

    if current_user.has_role('superuser') or current_user.has_role('user') or current_user.has_role('view1'):
        return True

    return False

对于我的第二个问题,我们只需要为我们的BaseView提供端点,如下所示:

class MyView(BaseView):
    @expose('/')
    def index(self):
        return self.render('views.html')

admin.add_view(MyView(name='Custom Views', endpoint='customviews'))

然后在你的jinja模板中你需要调用它:

href="{{ url_for('customviews.index') }}

只需注意一件事,这样做:

current_user.has_role('superuser') or current_user.has_role('user') or current_user.has_role('view1')
如果我们有这么多角色,可能会变得非常混乱,不知道我们如何处理这个问题,但希望这会对某人有所帮助。

谢谢大家。

答案 1 :(得分:0)

我知道这是一个老问题,但是对于以下代码

current_user.has_role('superuser') or current_user.has_role('user') or current_user.has_role('view1')

我想做的是在User类中包含一个hybrid_property(在Peewee和SQLAlchemy上都可用),以合并这些属性。所以看起来像这样:

@hybrid_property
def user_has_administrative_rights(self):
    return self.has_role('superuser') or self.has_role('user')