У мене є додаток для колби, що працює в докерному контейнері. Все працює добре, за винятком випадків, коли я хочу виконати деякі ручні роботи в тому ж докерному контейнері з оболонки колби. Проблема в тому, що url_for(x, _external=True)
завжди повертається https://localhost, неважливо, як я намагаюся встановити ім'я сервера в оболонці. Я, очевидно, намагався налаштувати SERVER_NAME без змін.
$ 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)
Шаблон jinja має:
{{ url_for("main.index", _external=True, _scheme="https") }
}
Що генерує: https://localhost
Я хотів би отримати: https://example.com
Я використовую Flask 0.11, Werkzeug 0.11.10 та Jinja2 2.8
Відповіді:
4 для відповіді № 1Ваш додаток використовує SERVER_NAME
визначається, коли був створений контекст програми.
Якщо ви хочете зробити це в оболонці, ви можете створити контекст тестового запиту після встановлення 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/
Ми можемо викопати код Flask, щоб зрозуміти його.
Фляга url_for
використовує appctx.url_adapter
створити цю URL-адресу. Це url_adapter
визначається, коли AppContext
ініціалізується, і це відбувається при запуску оболонки. Це називає app.create_url_adapter
і він використовує визначене SERVER_NAME
.