Donc, je pense qu'une réponse valable à cela est: le préfixe doit être configuré dans l'application serveur réelle que vous utilisez lorsque le développement est terminé. Apache, nginx, etc.
Cependant, si vous souhaitez que cela fonctionne pendant le développement lors de l'exécution de l'application Flask dans le débogage, jetez un œil à cet essentiel .
Flacon DispatcherMiddleware
à la rescousse!
Je vais copier le code ici pour la postérité:
"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)
Maintenant, lors de l'exécution du code ci-dessus en tant qu'application Flask autonome, http://localhost:5000/spam/
s'afficheHello, world!
.
Dans un commentaire sur une autre réponse, j'ai exprimé que je souhaitais faire quelque chose comme ceci:
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/
S'appliquant DispatcherMiddleware
à mon exemple artificiel:
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
etwerkzeug.routing.Map#bind_to_environ
il semble que cela devrait fonctionner - comment exécutiez- vous le code? (L'application doit en fait être montée sur le sous-chemin dans un environnement WSGI poururl_for
renvoyer la valeur attendue.)