2013-11-22 20 views
6

私は単一のアプリケーションに統合する必要がある複数の青写真を持っています。私はflask-loginを使ってログインを処理しています。しかし、私は青写真のLoginManager().user_loaderをどのように扱うのか混乱しています。複数の青写真でフラスコ内のログインを処理するにはどうすればよいですか?

これは私の現在のファイル構造です。

system/ 
    run.py 
    config.py 
    app/ 
     __init__.py 
     models.py 
     views/ 
      blueprint1.py 
      blueprint2.py 
     static/ 
     templates/ 
       <templates> 

これを実装する正しい方法は何ですか? __init__.pyに電話し、青写真でログインマネージャ変数をインポートしますか?または、それを青写真で個別に呼び出す必要がありますか?

私は質問をはっきりと描くことができたらと思っています。読んでいただきありがとうございます。

答えて

6

1つのアプリケーションでは、使用している青写真に関係なく、1つのログインマネージャを使用する必要があります(もちろん、青写真は独立している場合などがありますが、おそらくflask-loginは使用できません)。なぜなら:

  1. あなたは1つのユーザーローダー

どのようにログインマネージャの作品を持って/ユーザーがログインしていない場合は、彼がログインするリダイレクトされます登録ページ

  • を1つのエントリポイント
  • を持っています:

    1. これは、要求コンテキストにcurrent_user登録
    2. before_request、あなたのセッションを読み込み、ユーザーIDを取得し、user_loaderでユーザーをロードし、あなたがプライベート・ページにアクセスするとcurrent_userまたはAnonymousUser
    3. に設定し、login_requiredチェック他current_user.is_authenticated()は、ログイン時にページ
    4. ログインするリダイレクトするには、ユーザーIDを追加しますセッション

    にですから、フラスコのアプリケーションのための唯一のログインマネージャのインスタンスを初期化する必要がありますし、すべてのあなたの青写真でlogin_requiredcurrent_userを使用しています。

  • +0

    簡潔で正確に私が必要としたもの。どうもありがとう。 –

    3

    これは私がそれを処理している方法です。

    私はすべて初期化しています場所です。ここで

    import logging 
    import logging.config 
    
    import flask 
    import flask.globals as flask_global 
    import flask_login 
    
    from config import flask as flask_config 
    from rest.api import dashboard 
    from rest.api.util import login_decorator 
    
    logger = logging.getLogger(__name__) 
    
    # app 
    flask_app = flask.Flask(__name__) 
    flask_app.config.from_object(flask_config) 
    
    # login manager needs be set before blueprint registration 
    login_manager = flask_login.LoginManager() 
    login_manager.init_app(flask_app) 
    
    flask_app.register_blueprint(dashboard.blueprint) 
    
    
    # setting blueprint specific login view 
    # login_manager.login_view = "login" 
    
    
    @login_manager.user_loader 
    def load_user(user_id): 
        """ 
        This will be used many times like on using current_user 
        :param user_id: username 
        :return: user or none 
        """ 
        # http://librelist.com/browser/flask/2012/4/7/current-blueprint/#44814417e8289f5f5bb9683d416ee1ee 
        blueprint = flask_global.current_app.blueprints[request.blueprint] 
    
        if hasattr(blueprint, load_user): 
         return blueprint.load_user(user_id) 
    
        # https://flask-login.readthedocs.org/en/latest/#how-it-works 
        return None 
    

    をログインの独自の取り扱いと私の青写真さ:

    from __future__ import absolute_import 
    
    import flask 
    import flask_login 
    from flask import Blueprint 
    
    from core.models.profile import Agent 
    from core.utils import thread_local 
    from rest.api.util import login_decorator 
    
    blueprint = Blueprint('human', __name__, url_prefix='/human') 
    
    
    def load_user(user_id): 
        """ 
        This will be used many times like on using current_user 
        :param user_id: username 
        :return: user or none 
        """ 
        agent = None 
        try: 
         agent = Agent.objects.get(username=user_id) 
        except: 
         # https://flask-login.readthedocs.org/en/latest/#how-it-works 
         pass 
        return agent 
    
    
    @blueprint.record_once 
    def on_load(state): 
        """ 
        http://stackoverflow.com/a/20172064/742173 
    
        :param state: state 
        """ 
        blueprint.load_user = load_user 
        state.app.login_manager.blueprint_login_views[blueprint.name] = 'human.login' 
    
    
    @blueprint.route('/login', methods=['POST']) 
    @login_decorator.login_not_required 
    def login(): 
        username = flask.request.args.get('username') 
        password = flask.request.args.get('password') 
        try: 
         agent = Agent.objects.get(username=username) 
        except: 
         return 'Invalid username' 
    
        if not agent.check_password(password): 
         return 'Invalid password' 
    
        flask_login.login_user(agent) 
    
        return 'Valid login' 
    
    
    @blueprint.route("/logout") 
    def logout(): 
        flask_login.logout_user() 
        return 'Logout done' 
    
    
    @blueprint.before_request 
    def before_request(): 
        agent = flask_login.current_user 
        # https://flask-login.readthedocs.org/en/latest/#anonymous-users 
        is_logged_in = agent.get_id() is not None 
    
        login_not_required = getattr(flask.current_app.view_functions[flask.request.endpoint], 'login_not_required', False) 
        is_static_resource_call = flask.request.endpoint.startswith('static/') 
    
        if is_static_resource_call or is_logged_in or login_not_required: 
         if is_logged_in: 
          thread_local.set_current_brand_id(agent.brand_id) 
        else: 
         flask.abort(401) 
         # if we want to redirect to some page then we can use this. The appropriate login_view should be set 
         # return flask.current_app.login_manager.unauthorized() 
    

    ・ホープ助けになる。

    関連する問題