Cómo hacer que un decorador de python funcione en Flask con argumentos (para autorización)

Usé un fragmento de matraz para mi inicio de sesión en el matraz que verifica que un usuario haya iniciado sesión:

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

Y decoro vistas así:

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

También me gustaría hacer algo similar para la autorización. En este momento, tengo muchas vistas para comprobar que un usuario posee un recurso, digamos quehotdogs recurso.

Si el usuario log_in es el propietario de ese hotdog en particular, puede editar y administrar sus hotdogs. Si no lo está, lo echo a la pantalla no autorizada.

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

authorizeowner() toma un hotdog como entrada y comprueba que el propietario del hotdog registrado coincida con el nombre del propietario que figura en la variable de sesión.

Intenté hacer una función wrapper / decorator owns_hotdog similar a mi sesión iniciada, pero se quejó de que no aceptaba argumentos. ¿Cómo puedo lograr algo similar? Algo como...

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

Desde el mensaje de error, el decorador parece no estar recibiendo el argumento de hotdog al que las vistas de Flask tienen acceso desde la variable en la ruta. Mi esperanza es para algo como ...

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

Todo funciona con mi función actual de autorizador (hotdog), pero parece más limpio tener esto en su lugar como envoltorio en la parte superior de mi ruta, en lugar de ser la primera línea dentro de la ruta.

Algunas otras notas:

Sé que Flask-Security y Flask-Principal pueden administrar la autorización para mí. Desafortunadamente, estoy usando un back-end de base de datos no compatible y no puedo usar estas extensiones. Entonces, me veo obligado a hacer autenticación sin ellos.Si ve algún agujero deslumbrante al hacer la autorización de esta manera, ¡hágamelo saber!

Respuestas a la pregunta(1)

Su respuesta a la pregunta