如何在没有 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
我能找到的所有文档和示例都使用“{{ 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