Daher glaube ich, dass eine gültige Antwort darauf lautet: Das Präfix sollte in der tatsächlichen Serveranwendung konfiguriert werden, die Sie nach Abschluss der Entwicklung verwenden. Apache, Nginx usw.
Wenn Sie jedoch möchten, dass dies während der Entwicklung funktioniert, während Sie die Flask-App im Debug ausführen, sehen Sie sich diese Übersicht an .
Flasche DispatcherMiddleware
zur Rettung!
Ich werde den Code hier für die Nachwelt kopieren:
"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)
Wenn Sie den obigen Code jetzt als eigenständige Flask-App ausführen, http://localhost:5000/spam/
wird er angezeigt Hello, world!
.
In einem Kommentar zu einer anderen Antwort habe ich zum Ausdruck gebracht, dass ich so etwas tun möchte:
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/
Anwendung DispatcherMiddleware
auf mein erfundenes Beispiel:
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
undwerkzeug.routing.Map#bind_to_environ
es sieht so aus, als ob es funktionieren sollte - wie hast du den Code ausgeführt? (Die App muss tatsächlich in einer WSGI-Umgebung auf dem Unterpfad bereitgestellt werdenurl_for
, um den erwarteten Wert zurückzugeben.)