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!!")
}});
Ответы
Ответ 1
Об отзывах в колбе:
Об отзывах
Возвращаемое значение из функции представления автоматически преобразуется в объект ответа для вас. Если возвращаемое значение является строкой, оно преобразуется в объект ответа со строкой в качестве тела ответа, кодом состояния 200 OK
и mimetype text/html
. Логика, которую Flask применяет для преобразования возвращаемых значений в объекты ответа, заключается в следующем:
- Если объект ответа правильного типа возвращается, он напрямую возвращается из представления.
- Если это строка, создается объект ответа с этими данными и параметрами по умолчанию.
- Если кортеж возвращается, элементы в кортеже могут предоставить дополнительную информацию. Такие кортежи должны быть в форме
(response, status, headers)
или (response, headers)
где хотя бы один элемент должен быть в кортеже. Значение status
переопределит код состояния, и headers
могут быть списком или словарем дополнительных значений заголовка. - Если ничего из этого не работает, 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