Использование SqlAlchemy .filter () и .contains () [duplicate]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.

Давайте начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

Это простой синхронный вызов функции (где каждая строка кода выполняется одна за другой в последовательность), и результат будет таким же, как ожидалось.

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

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo() после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when exececution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

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

171
задан Martijn Pieters 3 March 2015 в 15:26
поделиться

4 ответа

Вам нужно установить тип содержимого запроса application/json для свойства .json; это будет None в противном случае. См. Документацию Flask Request :

Если тип mimetype application/json, это будет содержать проанализированные данные JSON. В противном случае это будет None.

Flask 0.10 добавил метод request.get_json() , и вы должны использовать этот метод вместо свойства .json. Вы можете сообщить методу пропустить требование типа содержимого, установив force=True.

Обратите внимание, что если в этот момент возникает исключение (возможно, это приводит к ответу 400 Bad Request ), данные JSON недействительны. Он каким-то образом искажен; вы можете проверить его с помощью валидатора JSON.

255
ответ дан Martijn Pieters 28 August 2018 в 08:16
поделиться

Для справки, вот полный код для отправки json из клиента Python:

import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
    print res.json()

Вход «json =» автоматически установит тип содержимого, как описано здесь: Сообщение JSON с использованием запросов Python

И вышеупомянутый клиент будет работать с этим кодом на стороне сервера:

from flask import Flask, request, jsonify
app = Flask(__name__)

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content['mytext']
    return jsonify({"uuid":uuid})

if __name__ == '__main__':
    app.run(host= '0.0.0.0',debug=True)
41
ответ дан Community 28 August 2018 в 08:16
поделиться

Так я бы это сделал, и это должно быть

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.get_json(silent=True)
    print content
    return uuid

С установкой silent=True функция get_json не работает при попытке получить тело json. По умолчанию установлено значение False. Параметр force=True будет игнорировать request.headers.get('Content-Type') == 'application/json', чтобы флакон делался для вас. По умолчанию также установлено значение False. См. документацию флагов .

Я настоятельно рекомендую оставить force=False и заставить клиента отправить заголовок Content-Type, чтобы сделать его более явным.

Надежда это помогает!

41
ответ дан radtek 28 August 2018 в 08:16
поделиться

Это решение работает:

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/hello', methods=['POST'])
def hello():
   return jsonify(request.json)
3
ответ дан trojek 28 August 2018 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: