Exigir uma chave de API para uma rota no Flask usando apenas um decorador

Os decoradores Python são ótimos, embora nem sempre fáceis de definir.

Flask é uma ótima biblioteca Python para construir APIs REST; faz uso intensivo de decoradores para coisas como esta:

@route('/')
def index():
return "index page! Woo!"

Mas ao construir uma API REST em torno de recursos protegidos, você geralmente precisa exigir uma chave de API para certas rotas (como, por exemplo, PUT para “/ users /”).

Agora, você pode ir e escrever código em cada visualização para validar uma chave de API. Você pode até escrever uma função que faça isso e apenas chamar a função em suas visualizações.

Pessoalmente, prefiro usar decoradores. É apenas mais limpo e simples.

Agora, para fazer isso, você precisa definir um decorador, e isso é um pouco feio:

from functools import wraps
from flask import request, abort

# The actual decorator function
def require_appkey(view_function):
@wraps(view_function)
# the new, post-decoration function. Note *args and **kwargs here.
def decorated_function(*args, **kwargs):
if request.args.get('key') and request.args.get('key') == APPKEY_HERE:
return view_function(*args, **kwargs)
else:
abort
(401)
return decorated_function

Agora você pode fazer coisas assim:

@route('/users/', methods=['PUT'])
@require_appkey
def put_user():
...

Como sempre acontece com o decorador em Flask, o routedecorador deve ser o decorador externo para que funcione corretamente.