我是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管理员构建整个网站,以便我可以保持用户体验的一致性。我这样做是错误的吗?
感谢您的时间。
如果您希望我提供有关此问题的更多信息,请告诉我。
亲切的问候。
答案 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')