Agregue un prefijo a todas las rutas de Flask

Resuelto Evan Hahn asked hace 11 años • 16 respuestas

Tengo un prefijo que quiero agregar a cada ruta. Ahora agrego una constante a la ruta en cada definición. ¿Hay alguna manera de hacer esto automáticamente?

PREFIX = "/abc/123"

@app.route(PREFIX + "/")
def index_page():
  return "This is a website about burritos"

@app.route(PREFIX + "/about")
def about_page():
  return "This is a website about burritos"
Evan Hahn avatar Sep 24 '13 02:09 Evan Hahn
Aceptado

Puedes poner tus rutas en un plano:

bp = Blueprint('burritos', __name__,
                        template_folder='templates')

@bp.route("/")
def index_page():
  return "This is a website about burritos"

@bp.route("/about")
def about_page():
  return "This is a website about burritos"

Luego registra el plano con la aplicación usando un prefijo:

app = Flask(__name__)
app.register_blueprint(bp, url_prefix='/abc/123')
Miguel Grinberg avatar Sep 23 '2013 21:09 Miguel Grinberg

La respuesta depende de cómo esté sirviendo esta aplicación.

Submontado dentro de otro contenedor WSGI

Suponiendo que va a ejecutar esta aplicación dentro de un contenedor WSGI (mod_wsgi, uwsgi, gunicorn, etc.); realmente necesita montar, en ese prefijo, la aplicación como una subparte de ese contenedor WSGI (cualquier cosa que diga WSGI servirá) y establecer su APPLICATION_ROOTvalor de configuración en su prefijo:

app.config["APPLICATION_ROOT"] = "/abc/123"

@app.route("/")
def index():
    return "The URL for this page is {}".format(url_for("index"))

# Will return "The URL for this page is /abc/123/"

Establecer el APPLICATION_ROOTvalor de configuración simplemente limita la cookie de sesión de Flask a ese prefijo de URL. Todo lo demás será manejado automáticamente por usted mediante las excelentes capacidades de manejo WSGI de Flask y Werkzeug.

Un ejemplo de cómo submontar correctamente su aplicación

Si no está seguro de lo que significa el primer párrafo, eche un vistazo a esta aplicación de ejemplo con Flask montado en su interior:

from flask import Flask, url_for
from werkzeug.serving import run_simple
from werkzeug.middleware.dispatcher import DispatcherMiddleware
 
app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/abc/123'
 
@app.route('/')
def index():
    return 'The URL for this page is {}'.format(url_for('index'))

def simple(env, resp):
    resp(b'200 OK', [(b'Content-Type', b'text/plain')])
    return [b'Hello WSGI World']

app.wsgi_app = DispatcherMiddleware(simple, {'/abc/123': app.wsgi_app})

if __name__ == '__main__':
    app.run('localhost', 5000)

Solicitudes de proxy a la aplicación

Si, por otro lado, ejecutará su aplicación Flask en la raíz de su contenedor WSGI y le enviará solicitudes mediante proxy (por ejemplo, si se está ejecutando FastCGI o si nginx está proxy_passenviando solicitudes para un subpunto final a su servidor uwsgi/ independiente gevent, entonces puede:

  • Utilice un Blueprint, como señala Miguel en su respuesta .
  • o use DispatcherMiddlewarefrom werkzeug(o la PrefixMiddlewarerespuesta de su27 ) para submontar su aplicación en el servidor WSGI independiente que está usando. (Consulte arriba un ejemplo de cómo submontar correctamente su aplicación para conocer el código a utilizar).
Sean Vieira avatar Sep 23 '2013 19:09 Sean Vieira