/ / Flask shell - як встановити ім'я сервера для url_for _external = True? - колба, jinja2

Рамка для фляга - як встановити ім'я сервера для url_for_external = Правда? - фляга, джинджа2

У мене є додаток для колби, що працює в докерному контейнері. Все працює добре, за винятком випадків, коли я хочу виконати деякі ручні роботи в тому ж докерному контейнері з оболонки колби. Проблема в тому, що 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.