4

我正在使用 Flask App builder 制作基本网页。我想根据登录的用户更改默认登录页面,例如 user1 应该重定向到 /home/user1 页面,user2 应该在登录后登录到 /home/general 页面等。

下面是我的自定义索引视图

  class MyIndexView(IndexView):
  index_template = 'index.html'

  @expose('/')
  def main(self):
      return redirect(url_for('AuthDBView.login'))

  @expose('/index')
  def index(self):
      return self.render_template('index.html', message="Welcome to my website")

并通过调用启动应用程序

appbuilder = AppBuilder(app, db.session, indexview=MyIndexView)

我还没有看到任何关于如何实现这一目标的示例或文档。非常感谢任何帮助

4

1 回答 1

11

首先,Flask-AppBuilder 依赖Flask-login来管理用户,所以你可能想阅读它的文档。

除此之外,Flask-AppBuilder在每次请求之前都会current_user在 Flask 的变量中注入(经过身份验证的或匿名的)g,因此您所要做的就是从g变量中获取用户并使用它做您想做的事情。

下面是一个将匿名用户(未登录)重定向到登录页面的 IndexView 示例。

如果用户不是匿名用户且其名称为 John,则将其重定向到HomeView.user端点。

如果其名称不是 John,则将其重定向到HomeView.general端点。

索引.py

from flask import g, url_for, redirect
from flask_appbuilder import IndexView, expose

class MyIndexView(IndexView):

    @expose('/')
    def index(self):
        user = g.user

        if user.is_anonymous:
            return redirect(url_for('AuthDBView.login'))
        else:
            if user.first_name == 'John':
                return redirect(url_for('HomeView.user'))
            else:
                return redirect(url_for('HomeView.general'))

内部视图.py

class HomeView(BaseView):
    route_base = "/home"

    @expose('/user/')
    def user(self):
        greeting = "Hello John"
        return self.render_template('logged_user.html', greeting=greeting)


    @ expose('/general/')
    def general(self):
        greeting = "Hello ordinary user"
        return self.render_template('logged_user.html', greeting=greeting)

appbuilder.add_view_no_menu(HomeView())
于 2017-08-05T23:38:39.080 回答