Как отправлять и получать явные нулевые значения через POST с приложением Flask - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь найти способ отправки полей с явными нулевыми значениями (в отличие от пустого строкового значения или отсутствия самого поля в запросе) через метод POST из моего пользовательского интерфейса в серверную часть приложения Flask.Последнее, кажется, интерпретирует пустые значения, которые я отправил через AJAX, как пустые строки.

Пока что я отправляю свои запросы AJAX из пользовательского интерфейса следующим образом:

$.ajax({
    type: 'POST',
    url: SOME_URL,
    data: {
        foo: null
    },
    success: function() {
        // process response
    }
});

И вот что происходит вFlask:

if request.form.get('foo') is None:
    # Happens only if 'foo' field was not included in the request
    return response('Got None')
elif request.form.get('foo') == '':
    # Happens for empty string or null sent as value of 'foo'
    return response('Got empty string')

По-видимому, можно JSON-кодировать данные POST и впоследствии декодировать их на сервере, сохраняя нулевые значения как таковые.Есть ли более элегантный способ сделать это?С одной стороны, использование WTForms для проверки стало бы намного сложнее, я думаю.И может показаться непоследовательным отправлять некоторые запросы в кодировке JSONenco, а другие - в незашифрованном виде.

1 Ответ

0 голосов
/ 07 февраля 2019

Проблема в вашем вызове ajax.По умолчанию $.ajax отправляется как application/x-www-form-urlencoded данные.Например:

{
    a: 'foo',
    b: 'bar',
    c: 'baz',
    d: null,
    e: ''
}

преобразуется jQuery в:

a=foo&b=bar&c=baz&d=&e=

Кажется, jQuery приводит null к пустой строке, поэтому он буквально отправляет пустую строку.JSON не существует.

Чтобы jQuery этого не делал, сделайте это самостоятельно:

$.ajax({
    type: 'POST',
    url: SOME_URL,
    // Send a JSON string (NOT an object)
    data: JSON.stringify({
        foo: null
    }),
    // Tell Flask that it is a JSON string, so Flask parses as JSON
    contentType: 'application/json; charset=utf-8',  
    success: function() {
        // process response
    }
});

В качестве примечания вы должны сделать это в Python:

data = request.get_json()

if 'foo' not in data:
    # 'foo' does not exist
elif data['foo'] is None:
    # 'foo' exists and is (js) null (python) None
elif data['foo'] == '':
    # it is the empty string

Или, возможно, что-то вроде этого:

try:
    foo = data['foo']
except KeyError:
    # Handle no 'foo' key
else:
    if foo is None:
         # Handle None case
    elif isinstance(foo, str):
         # Handle string case
    else:
         logger.warn('[%s] foo is not a string or None, and instead %s', flask_session_info(), type(foo).__name__)
...