2016-07-09 26 views
6

Sto usando flask-mwoauth per creare una semplice applicazione in Flask usando l'autenticazione OAuth su Mediawiki (e Wikipedia in particolare).Come eseguire l'override di un URL blueprint del pallone?

flask-mwoauth è un progetto che fornisce alcuni metodi di convenienza per interagire con Mediawiki Extensions: OAuth e aggiunge i seguenti URI:

  • /login - corre la stretta di mano OAuth e riporta l'utente al /
    • /login?next=/someurl restituirà l'utente a /someurl
  • /logout - cancella degli utenti token di accesso
    • /logout?next=/someurl restituirà all'utente di /someurl
  • /oauth-callback - richiamata da MW a finire la stretta di mano

Gli utenti chiave OAuth e il segreto sono memorizzati nella sessione.

Mi piacerebbe essere in grado di creare risposte personalizzate per alcuni di questi URI personalizzati. Prendiamo ad esempio /logout, la definizione della risposta in modo molto semplice():

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

vorrei definire nella mia applicazione il percorso /logout con una risposta personalizzata (ad esempio, il rendering di un modello), se Io uso il progetto quindi il percorso @app.route("/logout") viene ignorato.

Quello che vorrei sapere se è possibile "estendere" il progetto nel senso che posso definire un percorso /logout nella mia app, chiamare il metodo originale dal progetto e quindi fornire una risposta personalizzata.

risposta

1

Se si desidera ridefinire completamente il comportamento del percorso, il modo migliore è sostituire la classe MWOAuth. Ecco un esempio che funziona:

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) 

Apriamo /logout. Vedrete My custom logout. Come si può vedere la registrazione dei percorsi BluePrint avviene nel metodo init di MWOAuth.

Il secondo modo è utilizzare request callbacks. Ecco un esempio che dimostra il cambiamento nel corpo della risposta dopo il logout.

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' 

Apriamo /logout. Vedrete Data from after_logout.

Spero che questo aiuti.

Problemi correlati