Agregue un prefijo a todas las rutas de Flask
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"
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')
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_ROOT
valor 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_ROOT
valor 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_pass
enviando 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
DispatcherMiddleware
fromwerkzeug
(o laPrefixMiddleware
respuesta 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).