Comment faire un python fonction décorateur en Flacon avec des arguments (autorisation)

J'ai utilisé un flacon d'extrait de mon flacon de connexion qui vérifie que l'utilisateur est connecté:

from functools import wraps

def logged_in(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if session.get('logged_in') is not None:
            return f(*args, **kwargs)
        else:
            flash('Please log in first.', 'error')
            return redirect(url_for('login'))
    return decorated_function

Et je décore vues comme:

@app.route('/secrets', methods=['GET', 'POST'])
@logged_in
def secrets():
    error = None

Je voudrais faire quelque chose de similaire pour l'autorisation, trop. Maintenant, j'ai beaucoup de points de vue pour vérifier qu'un utilisateur est propriétaire d'une ressource, disons que le hotdogs ressource.

Si le logged_in utilisateur est le propriétaire du hot-dog, il peut modifier et gérer ses hot-dogs. Si il ne l'est pas, je le chasser de la non autorisés écran.

@app.route('/<hotdog>/addmustard/',methods=["GET"])
@logged_in
def addmustard(hotdog):
    if not (authorizeowner(hotdog)):
        return redirect(url_for('unauthorized'))
    do_stuff()

authorizeowner() prend un hot-dog en entrée et vérifie que l'enregistrement de hot dog propriétaire correspond au nom du propriétaire listés dans la variable de session.

J'ai essayé de faire un owns_hotdog wrapper/décorateur fonction similaire à mon consigné dans l'un, mais il se plaint qu'il n'a pas accepté les arguments. Comment puis-je obtenir quelque chose de similaire? Quelque chose comme...

def owns_hotdog(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not authorizeowner(hotdog):
            return f(*args, **kwargs)
        else:
            flash('Please log in first.', 'error')
            return redirect(url_for('login'))
    return decorated_function

Le message d'erreur, décorateur ne semble pas être la réception de la saucisse de hot-dog argument que Fiole de vues ont accès à partir de la variable dans la route. Mon espoir est pour quelque chose comme...

@app.route('/<hotdog>/addmustard/',methods=["GET"])
@logged_in
@owns_hotdog(hotdog)
def addmustard(hotdog):
    do_stuff()

Tout fonctionne avec mon actuelle authorizeowner(hot-dog) de la fonction, mais il semble plus propre à cette offre en place comme un wrapper sur le dessus de mon itinéraire, plutôt que comme la première ligne à l'intérieur de la route.

Quelques autres remarques:

  • Je sais que en Flacon de Sécurité et de Flacon Principal peut gérer
    autorisation pour moi. Malheureusement, je suis en utilisant un non pris en charge
    base de données back-end et je suis incapable d'utiliser ces extensions. Donc, je suis
    forcé de faire de l'authentification sans eux.
  • Si vous voyez des trous criantes en faisant l'autorisation de cette façon, s'il vous plaît laissez-moi savoir!
  • Essayez de remplacer if not authorizeowner(hotdog) avec if not authorizeowner(*args, **kwargs) et la suppression de (hotdog) de votre décorateur.
InformationsquelleAutor Mittenchops | 2012-12-15