【问题标题】:Flask Admin Custom ViewFlask 管理员自定义视图
【发布时间】:2016-04-02 10:15:05
【问题描述】:

我对 Flask/Flask-Admin 很陌生。 我已经按照烧瓶管理员的教程并设法让管理面板工作,但对如何实现以下内容略有迷失。 https://github.com/flask-admin/flask-admin/tree/master/examples/auth

  • 以普通用户身份登录时,我只能看到“主页”页面。 如何向“普通用户”公开其他视图并限制只读等操作。

  • 我创建了一个“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 链接时,他们会转到烧瓶管理界面中的 Site1 页面,但我不知道该怎么做。我可以为此创建一条新路线,但问题是我不能(不知道如何)扩展烧瓶管理模板。

例如,这可行,但它会将页面重定向到烧瓶管理模板之外:

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

并修改了模板>admin>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 admin 构建整个网站,这样我就可以保持用户体验的一致性。我这样做是不是错误的方式?

感谢您的宝贵时间。

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

亲切的问候。

【问题讨论】:

    标签: python-2.7 flask flask-admin


    【解决方案1】:

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

    以普通用户身份登录时,我只能看到“主页”页面。我怎样才能 向“普通用户”公开其他视图并限制读取等操作 只有等等。

    我们可以通过覆盖我们的视图函数 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')
    

    如果我们有这么多角色,可能会变得非常混乱,不确定我们将如何处理这个问题,但希望这会对某人有所帮助。

    谢谢大家。

    【讨论】:

      【解决方案2】:

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

      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')
      
      

      【讨论】:

        猜你喜欢
        • 2015-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-23
        • 2023-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多