我正在使用 flask-mwoauth 在Mediawiki(尤其是Wikipedia)上使用OAuth身份验证在Flask中创建一个简单的应用程序。
flask-mwoauth是一个蓝图,它提供了一些方便的方法来与Mediawiki Extensions:OAuth进行交互,并添加了以下URI:

  • /login-运行OAuth握手并使用户返回/
  • /login?next=/someurl将使用户返回/someurl
  • /logout-清除用户的访问 token
  • /logout?next=/someurl将使用户返回/someurl
  • /oauth-callback-从MW回调以完成握手

  • 用户的OAuth key 和 secret 存储在 session 中。

    我希望能够为某些自定义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,从蓝图调用原始方法,然后提供自定义响应。

    最佳答案

    如果要完全重新定义路由的行为,最好的方法是重写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路由的注册是通过initMWOAuth方法进行的。

    第二种方法是使用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

    希望这可以帮助。

    关于python - 如何覆盖Flask蓝图URL?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38284424/

    10-11 18:29