Использовать механизм шаблонов Jinja2 во внешнем файле javascript.

Я работаю над веб-проектом с использованием Python и Flask. Мне просто интересно, могу ли я получить доступ к параметрам, отправленным python в мои внешние файлы javascript? Он хорошо работает с html файлами или с js, встроенными в html файлы, но не когда javascript является extern.

См. ниже.

Код python

@app.route('/index')
def index():
    return render_template('index.html', firstArg = 2, secondArg = 3)

Код index.html

...
<body>
    <p>The first arg is {{firstArg}}.</p>
    <script src="index.js"></script>
</body>
...

И файл index.js

window.onload=function(){
    console.log('{{secondArg}}');
};

Итак, первый аргумент верен в html файле, но второй не работает в js файле. В браузере отображается Unexpected token {.

Может быть, невозможно использовать его во внешних js?

В противном случае мне нужно будет вставить secondArg в качестве входных данных в html и получить его в файле js, но он не очень чистый.

Если кто-то может помочь, спасибо.

Ответы

Ответ 1

index.js, вероятно, не обслуживается вашим экземпляром флэша, но он определенно не обрабатывается вашим механизмом шаблонирования и даже если он не будет иметь тот же контекст, что и запрашиваемый html.

Я думаю, что самым чистым решением было бы иметь функцию инициации в вашем index.js и вызывать ее из html файла:

<body>
    <p>The first arg is {{firstArg}}.</p>
    <script type="text/javascript" src="index.js"></script>
    <script type="text/javascript">
        yourInitFunction({{secondArg}});
    </script>
</body>

Вы также можете указать колбу для маршрутизации index.js тоже: @yourapp.route('index.js') так же, как вы сделали с route('/index'), однако это, вероятно, не очень хорошая идея.

Ответ 2

Кроме того, вы можете создать файл index_js.html (или тот же index.js) и {% include 'index_js.html' %} там, где вам это нужно.

1) Если вам нравится index_js.html - используйте <script> here is some JS templated code </script>. Далее: {% include 'index_js.html'%} в вашем шаблонном html.

2) Или, если вам нравится index.js - сделайте <script> {% include 'index.js' %} </script>.