Подтвердить что ты не робот

Flask url_for URL в Javascript

Каков рекомендуемый способ создания динамических URL-адресов в файлах Javascript при использовании фляжки? В шаблонах jinja2 и в представлениях python используется url_for, какой рекомендуемый способ сделать это в файлах .js? Поскольку они не интерпретируются движком шаблонов.

Что в основном нужно сделать:

// in comments.js
$.post(url_for('comment.comment_reply'));

Это невозможно.

Но, естественно, я могу выполнить это в шаблоне:

<script>
    $.post(url_for('comment.comment_reply'));
</script>
4b9b3361

Ответ 1

То, что @dumbmatter предлагает, в значительной степени считается де-факто стандартным способом. Но я думал, что это будет лучше. Поэтому мне удалось разработать этот плагин: Flask-JSGlue.

После добавления {{ JSGlue.include() }} в исходный код вы можете сделать следующее:

<script>
    $.post(Flask.url_for('comment.comment_reply', {article_id: 3}));
</script>

или

<script>
    location.href = Flask.url_for('index', {});
</script>

Ответ 2

Документация флагов предлагает использовать url_for в вашем файле HTML, чтобы установить переменную, содержащую корневой URL-адрес, к которому вы можете получить доступ в другом месте. Затем вам придется вручную создавать URL-адреса представления поверх этого, хотя, я думаю, вы могли бы хранить их аналогично корневому URL.

Ответ 3

@jeremy ответ правильный и, вероятно, более общий подход, но, как альтернативный ответ, обратите внимание, что dantezhu написал и опубликовал расширение фляжки, который претендует на точный перевод url-route-map-to-javascript, предложенный в комментарии.

Ответ 4

Я использую этот грязный и уродливый трюк:

"{{url_for('mypage', name=metadata.name,scale=93,group=2)}}"
.replace('93/group',scale+'/group')

где scale - переменная javascript, которую я хочу использовать для запроса AJAX. Таким образом, url_for генерации URL и JavaScript заменить параметр во время выполнения. Сгенерированный код выглядит примерно так:

"/ajaxservive/mynam/scale/93/group/2".replace('93/group',scale+'/group')

что довольно странно, но по-прежнему не может найти более элегантных решений.

Фактически глядя на код связанного расширения фляжки, он делает то же самое, но управляет общим случаем.

Ответ 5

Ищем решение, они придумывают это решение, где

  • Не требуется надстройка

  • Нет жесткого кода URL

Ключ должен понимать, что Jinja2 имеет возможность отображать javascript из коробки.


Установите папку своего шаблона примерно так:

/template
    /html
        /index.html
    /js
        /index.js

В вашем view.py

@app.route("/index_js")
def index_js():
    render_template("/js/index.js")

Теперь вместо того, чтобы обслуживать javascript из вашей статической папки. Вы будете использовать:

<script src="{{ url_for('index_js') }}"></script>

В конце концов, вы генерируете javascript на лету, он больше не является статическим файлом.


Теперь, внутри вашего javascript файла, просто используйте url_for, как в любом файле html.

Например, используя Jquery, чтобы сделать запрос Ajax

$.ajax({
  url: {{ url_for('endpoint_to_resource') }},
  method: "GET",
  success: call_back()
})

Ответ 6

В моем случае, Я пытался динамически создавать URL-адреса

Я решил проблему следующим образом (Примечание: я заменил синтаксис Angular на {[x]}:

<ul>
    <li ng-repeat="x in projects">
        {[x.title]}
        {% set url = url_for('static',filename="img/") %}

        <img src="{{url}}{[x.img]}">
    </li>
</ul>

Ответ 7

Я предлагаю следующее:

<script src="{{ url_for('static', filename='js/jquery.js') }}" type="text/javascript">
</script>

Прекрасно работает для меня