Entonces, creo que una respuesta válida a esto es: el prefijo debe configurarse en la aplicación de servidor real que usa cuando se completa el desarrollo. Apache, nginx, etc.
Sin embargo, si lo desea al trabajo durante el desarrollo mientras se ejecuta la aplicación en el frasco de depuración, echar un vistazo a este GIST .
¡Frasco está DispatcherMiddleware
al rescate!
Copiaré el código aquí para la posteridad:
"Serve a Flask app on a sub-url during localhost development."
from flask import Flask
APPLICATION_ROOT = '/spam'
app = Flask(__name__)
app.config.from_object(__name__) # I think this adds APPLICATION_ROOT
# to the config - I'm not exactly sure how!
# alternatively:
# app.config['APPLICATION_ROOT'] = APPLICATION_ROOT
@app.route('/')
def index():
return 'Hello, world!'
if __name__ == '__main__':
# Relevant documents:
# http://werkzeug.pocoo.org/docs/middlewares/
# http://flask.pocoo.org/docs/patterns/appdispatch/
from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware
app.config['DEBUG'] = True
# Load a dummy app at the root URL to give 404 errors.
# Serve app at APPLICATION_ROOT for localhost development.
application = DispatcherMiddleware(Flask('dummy_app'), {
app.config['APPLICATION_ROOT']: app,
})
run_simple('localhost', 5000, application, use_reloader=True)
Ahora, cuando se ejecuta el código anterior como una aplicación Flask independiente, http://localhost:5000/spam/
se mostrará Hello, world!
.
En un comentario sobre otra respuesta, expresé que deseaba hacer algo como esto:
from flask import Flask, Blueprint
# Let's pretend module_blueprint defines a route, '/record/<id>/'
from some_submodule.flask import module_blueprint
app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
app.run()
# I now would like to be able to get to my route via this url:
# http://host:8080/api/some_submodule/record/1/
Aplicando DispatcherMiddleware
a mi ejemplo artificial:
from flask import Flask, Blueprint
from flask.serving import run_simple
from flask.wsgi import DispatcherMiddleware
# Let's pretend module_blueprint defines a route, '/record/<id>/'
from some_submodule.flask import module_blueprint
app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
application = DispatcherMiddleware(Flask('dummy_app'), {
app.config['APPLICATION_ROOT']: app
})
run_simple('localhost', 5000, application, use_reloader=True)
# Now, this url works!
# http://host:8080/api/some_submodule/record/1/
flask.Flask#create_url_adapter
ywerkzeug.routing.Map#bind_to_environ
parece que debería funcionar - ¿cómo estaba ejecutando el código? (La aplicación en realidad debe montarse en la ruta secundaria en un entorno WSGI paraurl_for
devolver el valor esperado).