如何覆盖Flask蓝图网址?

时间:2016-07-09 17:27:14

标签: python oauth flask mediawiki-extensions

我正在使用flask-mwoauth在Flask上使用Mediawiki上的OAuth身份验证(特别是维基百科)创建一个简单的应用程序。

flask-mwoauth是一个蓝图,它提供了一些与Mediawiki Extensions:OAuth交互的便捷方法,并添加了以下URI:

  • /login - 运行OAuth握手并将用户返回/
    • /login?next=/someurl会将用户返回/someurl
  • /logout - 清除用户'访问令牌
    • /logout?next=/someurl会将用户返回/someurl
  • /oauth-callback - 来自MW的回调以完成握手

用户' OAuth密钥和密钥存储在会话中。

我希望能够为某些自定义URI创建自定义响应。以/logout为例,非常简单(__init__.py#L56)的响应定义:

@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 个答案:

答案 0 :(得分: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的{​​{1}}方法进行。

第二种方法是使用request callbacks。这是一个示例,演示了注销后响应正文的变化。

MWOAuth

让我们开放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

希望这有帮助。