Jinja2、JavaScript 和 CSP

Jinja2, JavaScript and CSP

我研究 Flask 和 Jinja2 已经有一段时间了,我注意到我找到的所有书籍和教程都把 {% block js %} 放在 {% block body %}。这似乎违反了 CSP,据我所知,它规定所有 javascript 代码都在外部文件中,并且包含这些文件的 <script> 标记位于页面的 <head> 块内。是 possible/safe 将我的 {% block js %} 放入我的基本模板的 <head> 块中,还是我这样做是在搬起石头砸自己的脚?

如果您使用自己的基本模板,那么您就是在定义块,这样您就可以以任何有意义的方式排列它们;特别是你可以替换

{% block body %}
...
{% endblock %}

{% block js %}
{{ super() }}
<script src="{{ url_for('static', filename='js/ckeditor/ckeditor.js') }}"></script>
<script>
  CKEDITOR.replace('editor')
</script>
{% endblock %}

符合 CSP 的版本

{% block js %}
{{ super() }}
<script src="{{ url_for('static', filename='js/ckeditor/ckeditor.js') }}"></script>
<script src="{{ url_for('static', filename='js/ckinit.js') }}"></script>
{% endblock %}

{% block body %}
...

其中 js/ckinit.js 包含

window.addEventListener("DOMContentLoaded", init, false);

function init(){
  CKEDITOR.replace('editor');
}

请注意,如果您使用的是模板包,这可能不起作用;特别是 Flask-Bootstrap 的 bootstrap/base.html{% block scripts %} 放在 </body></html> 标签之间。