如何在没有 jinja 的情况下从 Flask-wtf 获取 CSRF 令牌?

How do I get the CSRF token from Flask-wtf without jinja?

我能找到的所有文档和示例都使用“{{ csrf_token() }}”插入令牌。我不能这样做,因为我在 Vue 模板中工作(它不会被 jinja 解析)

我的 index.html 文件由 Jinja 解析,所以我怀疑解决方案可能涉及此问题,但我不知道从哪里开始。

编辑:如果我把它放在 index.html 和

 <p>{{ csrf_token() }} </p>

它按预期显示,但我不确定如何将其添加到我的 forms/axios 请求中

您将拥有一个使用 Vue 加载页面的基本 jinja 模板。

在我的特殊情况下,我是这样做的:

对于动态内容:

index.html

{% block content %}
  <div id="vue-container" backend-data="{{ csrf_token() }}"></div>
  <script nonce="{{ csp_nonce() }}">
      $('#vue-container').data('backend_current_user', {{ current_user_data | tojson }});
  </script>
{% endblock %}

{% block scripts %}
  <script src="{{ asset_url_for('index.js') }}"></script>
{% endblock %}

(注意这里使用了两种方法;元素属性和 JQuery。实际上我更频繁地使用 JQuery 方法,因为它对 JSON 数据更灵活)

index.js

import Vue from 'vue'
import Index from '@/components/Index.vue'

new Vue({
  render: function (h) {
    return h(Index, {
      props: {
        backendData: this.$el.attributes.backendData.value,
        backendCurrentUser: $('#vue-container').data('backend_current_user'),
      }
    })
  }
}).$mount('#vue-container')

index.Vue

<script>
export default {
  name: 'Index',
  props: {
    'backendCurrentUser': Object,
    'backendData': String
  },
...

对于静态内容:

实际上,对于 csrf 令牌,我只是将其放在页面上足够高的脚本中以首先加载:

base.html 或 index.html headers

<script type=text/javascript nonce="{{ csp_nonce() }}">
   $CSRF_TOKEN = '{{ csrf_token() }}';
</script>

然后在里面使用这个 templates/mixins:

  methods: {
    ajax_: function (url, action, formData, cb) {
      // eslint-disable-next-line
      formData.csrf_token = $CSRF_TOKEN || null