2016-07-09 10 views
6

私はflask-mwoauthを使って、MediaWiki(特にWikipedia)でOAuth認証を使用してFlaskで簡単なアプリケーションを作成しています。 OAuthを、次のURIを追加します: Flaskの青写真のURLを上書きする方法は?

flask-mwoauth

はMediawikiの拡張機能と対話するために、いくつかの便利なメソッドを提供青写真である

  • /loginを - OAuthのハンドシェイクを実行し、/
    • /login?next=/someurlに戻りますユーザーを返信します/someurl
  • /logout - OAuthのキーとシークレット保存されている - ユーザーのMWからのコールバックハンドシェイクを完了するために

ユーザーアクセストークン

  • /logout?next=/someurl/someurl
  • /oauth-callbackにユーザーを返しますがクリアされますセッションで

    私はこのカスタムURIのいくつかに対してカスタムレスポンスを作成したいと考えています。たとえば/logoutのために取る、非常にシンプルで、応答の定義():

    @self.bp.route('/logout') 
    def logout(): 
        session['mwo_token'] = None 
        session['username'] = None 
        if 'next' in request.args: 
         return redirect(request.args['next']) 
        return "Logged out!" 
    
    私はしかし場合は、(テンプレートのレンダリングなど)自分のアプリケーションのカスタム応答を持つルート/logoutで定義したいと思います

    青写真を使用すると、@app.route("/logout")のルートは無視されます。

    私のアプリでルート/logoutを定義できるという意味で青写真を拡張することができるかどうかを知りたい場合は、青写真から元のメソッドを呼び出して、カスタマイズされた応答を提供してください。

  • 答えて

    1

    ルートの動作を完全に再定義する場合は、MWOAuthクラスをオーバーライドするのが最善の方法です。ここで動作する例:

    import os 
    
    from flask import Flask, Blueprint 
    from flask_mwoauth import MWOAuth 
    
    app = Flask(__name__) 
    app.secret_key = os.urandom(24) 
    
    
    class MyMWOAuth(MWOAuth): 
        def __init__(self, 
           base_url='https://www.mediawiki.org/w', 
           clean_url="Deprecated", 
           default_return_to='index', 
           consumer_key=None, 
           consumer_secret=None, 
           name="Deprecated"): 
         # I skipped other rows. It's just an example 
         self.bp = Blueprint('mwoauth', __name__) 
         # By the way you can customize here login and oauth-callback 
         @self.bp.route('/logout') 
         def logout(): 
          # your custom logic here... 
          return "My custom logout" 
    
    
    mwoauth = MyMWOAuth(consumer_key='test', consumer_secret='test') 
    app.register_blueprint(mwoauth.bp) 
    
    
    if __name__ == "__main__": 
        app.run(debug=True, threaded=True) 
    

    /logoutを開きましょう。 My custom logoutが表示されます。 BluePrintルートの登録は、のinitの方法で行われます。

    第2の方法は、request callbacksを使用することです。ここでは、ログアウト後の応答の本文の変化を示す例を示します。

    from flask import g, request 
    
    
    def after_this_request(f): 
        if not hasattr(g, 'after_request_callbacks'): 
         g.after_request_callbacks = [] 
        g.after_request_callbacks.append(f) 
        return f 
    
    
    @app.after_request 
    def call_after_request_callbacks(r): 
        for callback in getattr(g, 'after_request_callbacks',()): 
         callback(r) 
        return r 
    
    
    @app.before_request 
    def before_logout(): 
        @after_this_request 
        def after_logout(response): 
         # check if called route == '/logout' 
         # in our case response.data == 'Logged out!' 
         # see: https://github.com/valhallasw/flask-mwoauth/blob/master/flask_mwoauth/__init__.py#L48 
         if request.url_rule.endpoint == 'mwoauth.logout': 
          # custom logic here... 
          # for example I change data in request 
          response.data = 'Data from after_logout' 
    

    /logoutを開きましょう。 Data from after_logoutが表示されます。

    これが役に立ちます。

    関連する問題