代码之家  ›  专栏  ›  技术社区  ›  Massifox

如何将Flask登录与Dash应用程序合并?

  •  1
  • Massifox  · 技术社区  · 6 年前

    我必须设计一个提供Flask服务和Dash服务的web应用程序。例如,我想在Flask中创建一个登录名,并结合Dash应用程序。问题是我不能用dash绑定flask登录名。我需要一个像“@require_login”这样的方法来过滤对Dash服务的访问。 代码如下:

    app_flask = Flask(__name__)
    
    app_flask.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////login.db'
    app_flask.config['SECRET_KEY'] = 'thisissecret'
    
    db = SQLAlchemy(app_flask)
    login_manager = LoginManager()
    login_manager.init_app(app_flask)
    
    class User(UserMixin, db.Model):
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(30), unique=True)
    
    @login_manager.user_loader
    def load_user(user_id):
        return User.query.get(int(user_id))
    
    @app_flask.route('/')
    def index():
        user = User.query.filter_by(username='admin').first()
        login_user(user)
        return 'You are now logged in!'
    
    @app_flask.route('/logout')
    @login_required
    def logout():
        logout_user()
        return 'You are now logged out!'
    
    @app_flask.route('/home')
    @login_required
    def home():
        return 'The current FLASK user is ' + current_user.username
    
    # TODO how to add login_required for dash? 
    app_dash = Dash(server=app_flask, url_base_pathname='/dash/')
    app_dash.layout = html.H1('MY DASH APP')
    
    
    if __name__ == '__main__':
        app_dash.run_server(debug=True)
    
    2 回复  |  直到 5 年前
        1
  •  17
  •   Azmi Kamis    5 年前

    这条线, app_dash = Dash(server=app_flask, url_base_pathname='/dash/') ,创造新的 view_functions 在里面 app_flask 通过其 url_base_pathname .

    您可以调试和检查 app_flask.view_functions 创建之前和之后 app_dash .

    现在我们知道了 查看功能 都是由 app_dash ,我们可以申请 login_required 手动将其删除。

    for view_func in app_flask.view_functions:
        if view_func.startswith(app_dash.url_base_pathname):
            app_flask.view_functions[view_func] = login_required(app_flask.view_functions[view_func])
    
    “app_dash”端点现在将受到保护。
        2
  •  5
  •   Jelle    4 年前

    如果您使用 @app.before_request ,并且仅在登录或端点标记为公共时才允许请求。

    def check_route_access():
        if request.endpoint is None:
            return redirect("/login")
     
        func = app.view_functions[request.endpoint]
        if (getattr(func, "is_public", False)):
            return  # Access granted
    
        # check if user is logged in (using session variable)
        user = session.get("user", None)
        if not user:
            redirect("/login")
        else:
            return  # Access granted```
    
    

    现在将检查所有端点,甚至dash应用程序端点。

    添加这个名为 public_route :

    def public_route(function):
        function.is_public = True
        return function
    

    并将decorator添加到公共方法中,如登录、错误页面等。

    @public_route
    @app.route("/login")
    def login():
       # show/handle login page
       # call did_login(username) when somebody successfully logged in
    
    
    def did_login(username):
        session["user"] = username
    

    这样你就不需要 @login_required 因为所有端点都需要登录,除非 @public_route .

        3
  •  1
  •   Mianto    6 年前

    解决方案:烧瓶会话(使用cookie)

    from flask import session

    这是一个例子:

    @login_manager.user_loader def load_user(user_id): # I think here it's good session["uid"] = user_id return User.query.get(int(user_id))

    # TODO how to add login_required for dash? if "uid" in session : app_dash = Dash(server=app_flask, url_base_pathname='/dash/') app_dash.layout = html.H1('MY DASH APP')