2016-07-09 19 views
6

Ich verwende flask-mwoauth, um eine einfache Anwendung in Flask mit OAuth-Authentifizierung auf Mediawiki (und insbesondere Wikipedia) zu erstellen.Wie überschreibt man eine Flask Blueprint URL?

flask-mwoauth ist ein Entwurf, der einige bequeme Methoden bietet mit Mediawiki-Erweiterungen zu interagieren: OAuth und fügt die folgenden URIs:

  • /login - führt die OAuth-Handshake und bringt den Benutzer zu /
    • /login?next=/someurl wird den Benutzer zu /someurl
  • zurückgeben- löscht der Benutzer Zugriffstoken
    • /logout?next=/someurl wird der Benutzer zu /someurl
  • /oauth-callback zurückkehren - Rückruf von MW das Handshake zu beenden

der Benutzer OAuth-Schlüssel und geheimen gespeichert werden in der Sitzung.

Ich möchte in der Lage sein, benutzerdefinierte Antworten für einige dieser benutzerdefinierten URIs zu erstellen. Nehmen Sie zum Beispiel /logout, die Definition der Antwort auf sehr einfachen():

@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!" 

Ich mag würde in meiner Anwendung der Route /logout mit einer benutzerdefinierten Antwort definieren (zB eine Vorlage Rendering), aber wenn Ich benutze den Bauplan, dann wird die Route @app.route("/logout") ignoriert.

Was würde ich gerne wissen, wenn es möglich ist, den Blueprint in dem Sinne zu erweitern, dass ich eine Route /logout in meiner App definieren kann, rufen Sie die ursprüngliche Methode aus dem Blueprint und dann eine benutzerdefinierte Antwort.

Antwort

1

Wenn Sie das Verhalten der Route völlig neu definieren möchten, ist der beste Weg MWOAuth Klasse zu überschreiben. Hier ein Beispiel, das funktioniert:

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) 

Öffnen wir /logout. Sie werden sehen My custom logout. Wie Sie sehen können Registrierung von BluePrint Routen findet in init Methode von MWOAuth statt.

Die zweite Möglichkeit ist die Verwendung request callbacks. Hier ein Beispiel, das die Änderung im Body der Antwort nach dem Abmelden zeigt.

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' 

Öffnen wir /logout. Sie werden Data from after_logout sehen.

Hoffe, das hilft.