2015-12-26 2 views
6

(Это, наверное, немой вопрос, поэтому, пожалуйста, наденьте свои щиты тупости!) Я был программистом на PHP и теперь изучаю Python + Flask. Недавно мне пришлось много бороться с отправкой данных через AJAX и возвращением ответа. Наконец, код, который работал был:Почему json.dumps() обязательный флажок?

@app.route('/save', methods=['POST']) 
def save_subscriptions(): 
    if request.method == 'POST': 
     sites = request.form.get('selected') 
     print(sites) 
     sites = sites[0:-1]   
     g.cursor.execute('UPDATE users SET sites = %s WHERE email = %s', [sites, session.get('email')]) 
     g.db.commit() 
     return json.dumps({'status': 'success'}) 

Если изменить return json.dumps({'status': 'success'}) к return 1 я получаю исключение, что int is not callable. Прежде всего, я не понимаю, кто пытается назвать это int и почему? Во-вторых, в PHP часто было возможно только echo 1;, и это стало бы ответом AJAX. Почему же return 1 не работает в колбе?

+2

Пожалуйста, дезинфицируйте ваши SQL-запросы! –

+0

@WillSherwood Спасибо! Вчера мне стало интересно, что было эквивалентно подготовленным заявлениям PHP, но не задумывались о его личном проекте. Я изменю это пронто! – dotslash

+0

@WillSherwood Эй, подожди! Я смотрю на http://bobby-tables.com/python.html и задаюсь вопросом, не очищены ли мои запросы. Что еще мне нужно? – dotslash

ответ

7

Логика, какой должна быть возвращена Настой просмотров is described in the docs подробно:

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

  • Если объект ответа правильного типа возвращается он непосредственно вернулся из вида.

  • Если это строка, создается объект ответа с этими данными и параметрами по умолчанию.

  • Если кортеж возвращен, то элементов в кортеже могут предоставить дополнительную информацию. Такие кортежи должны быть быть в форме (ответ, статус, заголовки), где хотя бы один элемент имеет , чтобы быть в кортеже. Значение статуса переопределит код состояния, а заголовки могут быть списком или словарем дополнительных значений заголовка.

  • Если ничего не работает, Flask будет считать возвращаемое значение действительным WSGI и преобразовать его в объект-ответ.

В вашем случае число 1 возвращается - Настой применяется последнее правило и пытается превратить его в объект ответа и не удается. Внутренне make_response() method называется, который, в случае целого, назвал бы force_type() method из более werkzeug.Response класса, который в конечном итоге неудачи, создавая экземпляр BaseResponse класса при попытке создать экземпляр WSGI приложения:

app_rv = app(environ, start_response) 

где app в вашем case is integer 1.

+0

Ах, глупый я! Поэтому все, что мне нужно было сделать, это «вернуть» 1 ». Благодаря! Примите это как мой ответ, как только сайт разрешит мне. – dotslash

+0

И спасибо за полное объяснение. Заставляет меня видеть веб-рамки в совершенно ином свете. :-) – dotslash

Смежные вопросы