CSRF токен отсутствует в первом посте запроса Flask - PullRequest
0 голосов
/ 20 ноября 2018

Я пробую колбу, у меня есть форма, которая подается по следующему маршруту:

@app.route("/register",methods=['GET','POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        employee = Employee(name=form.name,emp_id=form.emp_id,email=form.email,password=form.password)
        return redirect(url_for('home'))
    return render_template('register.html',form=form)

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

@app.route('/email',methods=['POST'])
def email():
    print(request.form['email'])
    return "success"

Ниже приведен мой javascript-код для запроса ajax, который вызывается при возникновении события размытия в поле ввода.

function emailSubmit(event) {

    console.log($('#email').serialize());
    $.ajax({
        type: "POST",
        url: url,
        data: $('#email').serialize(), // serializes the form's elements.
        success: function(data) {
            console.log(data) // display the returned data in the console.
        }
    });

    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrfToken)
            }
        }
    })

}

Файл javascript находится в статической папке, а URL и csrf_token предоставляются с использованием глобальных переменных.

Проблема в том, что при первом отправлении запроса на маршрут "email" я получаю

Неверный запрос "Маркер CSRF отсутствует."

Но все прекрасно работает, начиная со следующего запроса. Тот же токен csrf отправляется и в следующем запросе. Почему это происходит? Я включил защиту CSRF глобально.

...