django csrf 令牌:CSRF 令牌丢失或不正确

时间:2021-04-20 08:39:42

标签: python django csrf

我不使用django表单,我们只用API处理它并响应结果。 我想在不使用@csrf_exempt 的情况下处理它。 使用表单时,我知道您使用的是标签,但是在这种情况下,很难编写标签。我无法摆脱 csrf,所以我需要帮助。 当收到作为帖子的请求时,“CSRF 令牌丢失或不正确。”出现。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果这是一个无状态 API(即您不使用 cookie),您可以安全地禁用 CSRF,如下所示:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def post(request):
    return 'page'

答案 1 :(得分:0)

如果您需要 csrf 令牌,请检查 csrf doc

您可以将给定的代码添加到全局 js 文件中,然后在任何地方引用它。我在这里包含了代码,但在文档中是一样的。

function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            const cookie = cookies[i].trim();
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

然后获取 csrf 令牌:

const csrftoken = getCookie('csrftoken');

以下是我如何在提取中使用它的示例:

fetch('some_url', {
        method: 'POST',
        headers:{
            'Accept': 'application/json',
            'X-Requested-With': 'XMLHttpRequest',
            'X-CSRFToken': csrftoken,
    },
        body: JSON.stringify({
            some_key: some_var,
            ...
        })
    })
    .then(response => {
        jsonResponse = response.json();
        status_code = response.status;

        if(status_code != 200) {
            
            alert('error');
        } else {
            alert('success');
        }
    })
    .catch(error => {
        console.log(error)
    })

但是通过包含 csrf 模板标记 {% csrf_token %}

确保 csrf 令牌在您的模板中可用