Подтвердить что ты не робот

Flask, как вернуть код статуса успеха для вызова ajax

На стороне сервера я просто распечатываю json-as-dictionary на консоли

@app.route('/',methods=['GET','POST'])
@login_required
def index():
    if request.method == "POST":
        print request.json.keys()
    return "hello world"

Теперь, когда я делаю почтовый запрос через ajax, консоль печатает словарь с нужным содержимым.

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

Итак, как мне отправить статус OK моему клиенту, чтобы сказать, что все в порядке?

Для полноты, вот мой клиентский код

$.ajax({
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(myData),
    dataType: 'json',
    url: '/',
    success: function () {
        console.log("This is never getting printed!!")
    }});
4b9b3361

Ответ 1

Об отзывах в колбе:

Об отзывах

Возвращаемое значение из функции представления автоматически преобразуется в объект ответа для вас. Если возвращаемое значение является строкой, оно преобразуется в объект ответа со строкой в качестве тела ответа, кодом состояния 200 OK и mimetype text/html. Логика, которую Flask применяет для преобразования возвращаемых значений в объекты ответа, заключается в следующем:

  1. Если объект ответа правильного типа возвращается, он напрямую возвращается из представления.
  2. Если это строка, создается объект ответа с этими данными и параметрами по умолчанию.
  3. Если кортеж возвращается, элементы в кортеже могут предоставить дополнительную информацию. Такие кортежи должны быть в форме (response, status, headers) или (response, headers) где хотя бы один элемент должен быть в кортеже. Значение status переопределит код состояния, и headers могут быть списком или словарем дополнительных значений заголовка.
  4. Если ничего из этого не работает, Flask предположит, что возвращаемое значение является допустимым приложением WSGI, и преобразует его в объект ответа.

Таким образом, если вы возвращаете текстовую строку (как вы делаете), код состояния, который должен получить ваш вызов AJAX, будет 200 OK, и ваш успешный обратный вызов должен выполняться. Однако я рекомендую вам вернуть ответ в формате JSON, например:

return json.dumps({'success':True}), 200, {'ContentType':'application/json'} 

Ответ 2

В качестве опции для ответа aabilio вы можете использовать метод jsonify в Flask, который автоматически устанавливает Content-Type:

from flask import jsonify

resp = jsonify(success=True)
return resp

Вы можете (необязательно) установить код ответа явно:

resp.status_code = 200

Ответ 3

В дополнение к уже опубликованным ответам я нахожу использование метода make_response во Flask (начиная с версии 0.6) более ясной альтернативой, особенно когда вам необходимо вернуть коды состояния с ответом JSON для API от Flask:

from flask import jsonify, make_response

# ... other code ...
data = {'message': 'Created', 'code': 'SUCCESS'}
return make_response(jsonify(data), 201)

Кроме того, этот подход автоматически устанавливает заголовок Content-Type на application/json.

Ответ 4

При возврате ответа с использованием jsonify просто добавьте status_code в качестве второго параметра return. Я использовал jsonify в этом декораторе admin_required с неавторизованным HTTP-кодом 401. Пример:

return jsonify({'error': 'Admin access is required'}), 401

Полный пример:

def admin_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        if current_user and hasattr(current_user, 'user_type') and current_user.user_type == 'admin':
            return f(*args, **kwargs)
        else:
            if '/api/' in request.url_rule.rule:
                return jsonify({'error': 'Admin access is required'}), 401

            flash(_('Admin access required'))
            return redirect(url_for('main.public_index'))

    return decorated