Donc, je crois qu'une réponse valable à cela est : le préfixe doit être configuré dans l'application serveur réelle que vous utilisez une fois le développement terminé. Apache, nginx, etc.
Cependant, si vous souhaitez que cela fonctionne pendant le développement tout en exécutant l'application Flask en mode débogage, jetez un coup d'œil à ce gist.
Le DispatcherMiddleware
de Flask à la rescousse!
Je copierai le code ici pour mémoire:
"Servir une application Flask sur une sous-URL pendant le développement en local."
from flask import Flask
APPLICATION_ROOT = '/spam'
app = Flask(__name__)
app.config.from_object(__name__) # Je pense que cela ajoute APPLICATION_ROOT
# à la configuration - Je ne suis pas exactement sûr comment!
# ou bien:
# app.config['APPLICATION_ROOT'] = APPLICATION_ROOT
@app.route('/')
def index():
return 'Bonjour, monde!'
if __name__ == '__main__':
# Documents pertinents:
# 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
# Charger une application bidon à l'URL racine pour générer des erreurs 404.
# Servir l'application à APPLICATION_ROOT pour le développement en local.
application = DispatcherMiddleware(Flask('dummy_app'), {
app.config['APPLICATION_ROOT']: app,
})
run_simple('localhost', 5000, application, use_reloader=True)
Maintenant, en exécutant le code ci-dessus en tant qu'application Flask autonome, http://localhost:5000/spam/
affichera Bonjour, monde!
.
Dans un commentaire sur une autre réponse, j'ai exprimé le souhait de faire quelque chose comme ceci:
from flask import Flask, Blueprint
# Imaginons que module_blueprint définit une route, '/record//'
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()
# Je voudrais maintenant pouvoir accéder à ma route via cette URL:
# http://host:8080/api/some_submodule/record/1/
Application du DispatcherMiddleware
à mon exemple inventé:
from flask import Flask, Blueprint
from flask.serving import run_simple
from flask.wsgi import DispatcherMiddleware
# Imaginons que module_blueprint définit une route, '/record//'
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)
# Maintenant, cette URL fonctionne!
# http://host:8080/api/some_submodule/record/1/