2016-07-09 83 views
6

我正在使用flask-mwoauth在Flask中使用Mediawiki(特別是維基百科)上的OAuth身份驗證創建一個簡單的應用程序。如何覆蓋Flask藍圖URL?

flask-mwoauth是提供一些方便的方法與MediaWiki擴展互動的藍圖:OAuth的並增加了以下的URI:

  • /login - 運行OAuth的握手,並返回用戶/
    • /login?next=/someurl將用戶返回到/someurl
  • /logout - 清除用戶的訪問令牌
    • /logout?next=/someurl將用戶返回到/someurl
  • /oauth-callback - 回調從兆瓦完成握手

用戶的OAuth鍵值和密鑰存儲在會議中。

我希望能夠爲這些自定義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

希望這會有所幫助。