Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

425
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!