2016-07-09 4 views
6

나는 flask-mwoauth을 사용하여 Flask에서 Mediawiki (와 특히 Wikipedia)에서 OAuth 인증을 사용하여 간단한 응용 프로그램을 만듭니다. OAuth를 다음과 같은 URI를 추가합니다 : 플라스크 청사진 URL을 재정의하는 방법은 무엇입니까?

flask-mwoauth

는 위키 확장과 통신 할 수있는 편리한 방법을 제공하는 청사진이다

  • /login을 -의 OAuth 핸드 셰이크를 실행하고 /
    • /login?next=/someurl로 사용자를 반환 사용자는 /someurl
  • /logout - 키 및 비밀번호 저장됩니다 - '콜백을 MW에서

가 사용자 핸드 쉐이크 완료 /someurl

  • /oauth-callback에 사용자를 반환 액세스 토큰
    • /logout?next=/someurl '에게 사용자를 지 웁니다 세션에서.

      일부 맞춤 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 방법으로 MWOAuth으로 이루어집니다.

    두 번째 방법은 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이 표시됩니다.

    희망이 도움이됩니다.