Ich habe eine Flaschen-App, die in einem Docker-Container ausgeführt wird. Alles funktioniert gut, außer wenn ich einige manuelle Jobs in demselben Docker-Container von der Kolbenhülle aus erledigen möchte. Das Problem ist, dass die url_for(x, _external=True)
kommt immer zurück https://localhostspielt keine Rolle, wie ich versuche, den Servernamen in der Shell festzulegen. Ich habe natürlich versucht, den SERVER_NAME auf keine Änderung zu setzen.
$ python manage.py shell
>>> from flask import current_app
>>> current_app.config["SERVER_NAME"] = "example.com"
>>> from app import models
>>> models.Registration.send_registration(id=123)
Die Jinja-Vorlage hat:
{{ url_for("main.index", _external=True, _scheme="https") }
}
Was erzeugt: https://localhost
Ich hätte gern: https://example.com
Ich benutze Flask 0.11, Werkzeug 0.11.10 und Jinja2 2.8
Antworten:
4 für die Antwort № 1Ihre App verwendet die SERVER_NAME
definiert, wann der Anwendungskontext erstellt wurde.
Wenn Sie dies in einer Shell tun möchten, können Sie einen Testanforderungskontext erstellen, nachdem Sie das festgelegt haben SERVER_NAME
.
>>> from flask import current_app, url_for
>>> current_app.config["SERVER_NAME"] = "example.com"
>>> with current_app.test_request_context():
... url = url_for("index", _external=True)
...
>>> print url
http://example.com/
Wir können in Flask-Code graben, um es zu verstehen.
Flasche url_for
nutzt die appctx.url_adapter
um diese URL zu erstellen. Diese url_adapter
ist definiert, wenn der AppContext
wird initialisiert und passiert, wenn die Shell gestartet wird. Es nennt das app.create_url_adapter
und es verwendet das definierte SERVER_NAME
.