Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

421
Vistas
Flask: cómo registrar un contenedor para todos los métodos

Me he estado moviendo de la botella al matraz. Soy el tipo de persona que prefiere escribir su propio código en lugar de descargar paquetes de Internet si el código que necesito es de 20 líneas o menos. Tomemos como ejemplo la compatibilidad con el protocolo de autenticación Basic . En botella podría escribir:

 def allow_anonymous(): """assign a _allow_anonymous flag to functions not requiring authentication""" def wrapper(fn): fn._allow_anonymous = True return fn return wrapper def auth_middleware(fn): """perform authentication (pre-req)""" def wrapper(*a, **ka): # if the allow_anonymous annotation is set then bypass this auth if hasattr(fn, '_allow_anonymous') and fn._allow_anonymous: return fn(*a, **ka) user, password = request.auth or (None, None) if user is None or not check(user, password): err = HTTPError(401, text) err.add_header('WWW-Authenticate', 'Basic realm="%s"' % realm) return err return fn(*a, **ka) return wrapper ... app = Bottle() app.install(middleware.auth_middleware)

El código anterior me brindó soporte completo para el protocolo de autenticación básico para todos los métodos, a menos que esté explícitamente decorado con el envoltorio @allow_anonymous . Solo soy un principiante con el matraz. Me está costando mucho lograr el código compatible con botellas anterior en el matraz sin agregar dependencias en más paquetes de python o una placa de caldera excesiva. ¿Cómo se maneja esto directa y claramente en el matraz?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Definitivamente puedes usar algunas de las funcionalidades de Flass-httpauth tú mismo, si lo deseas :-P

Creo que necesitará jugar algunos juegos before_request (no muy hermosos), o alternativamente llamar a add_url_rule de matraz con un método decorado para cada punto final de API (o tener un decorador de route propio que lo haga). add_url_rule obtiene una función de visualización que suele ser su controlador de punto final de API, pero en su caso, será un método envuelto de una manera muy parecida a la que proporcionó en la publicación ( auth_middleware ).

La esencia de esto:

 from flask import Flask, make_response, request app = Flask(__name__) def view_wrapper(fn): """ Create a wrapped view function that checks user authorization """ def protected_view(*a, **ka): # if the allow_anonymous annotation is set then bypass this auth if hasattr(fn, '_allow_anonymous') and fn._allow_anonymous: return fn(*a, **ka) # consult werkzeug's authorization mixin user, password = (request.authorization.username, request.authorization.password) if request.authorization else (None, None) if user is None or not check(user, password): err_response = make_response(text, 401) err_response.headers['WWW-Authenticate'] = 'Basic realm="%s"' % realm return err_response return fn(*a, **ka) return protected_view # An endpoint def hello(): return 'hello there' app.add_url_rule('/', 'hello', view_wrapper(hello))

Por supuesto, esto puede (y debe) mejorarse aún más con Blueprints , etc.

over 4 years ago · Santiago Trujillo Denunciar

0

Nota n. ° 1: esto se basa en respuestas separadas en SO.

Nota #2: esto no usa planos. Una vez más, soy nuevo en el mundo de los matraces y agradezco que los planos ayuden a escalar la aplicación, pero paso a paso...

 def allow_anonymous(decorated_function): decorated_function.is_public = True return decorated_function @app.before_request def auth_middleware(): fn = app.view_functions[request.endpoint] if hasattr(fn, 'allow_anonymous') and fn.allow_anonymous: # anonymous permitted return elif my_custom_authentication(): # anonymous not permitted authentication succeeded return else: # anonymous not permitted authentication failed err_response = make_response(text, 401) err_response.headers['WWW-Authenticate'] = 'Basic realm="%s"' % realm return err_response @app.route('/public_thing') @allow_anonymous def public_thing(): return 'yo' @app.route('/regular_thing') def regular_thing(): return 'if you can read this youre authenticated.'
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda