Как использовать Pagekite для webhooks? [Дубликат]

Мне кажется, что спорить о «pass-by-reference vs pass-by-value» не очень полезно.

Если вы говорите: «Java - это pass-by-whatever (reference / value ) ", в любом случае вы не получите полного ответа. Вот еще одна дополнительная информация, которая, мы надеемся, поможет понять, что происходит в памяти.

Курс Crash по стеку / куче прежде, чем мы перейдем к реализации Java: значения идут и выходят из стека с хорошей упорядоченной манерой, например стопку тарелок в столовой. Память в куче (также известная как динамическая память) беспорядочна и дезорганизована. JVM просто находит пространство везде, где может, и освобождает его, поскольку переменные, которые его используют, больше не нужны.

Хорошо. Во-первых, локальные примитивы идут в стек. Таким образом, этот код:

int x = 3;
float y = 101.1f;
boolean amIAwesome = true;

приводит к этому:

primitives on the stack [/g0]

Когда вы объявляете и создаете экземпляр объекта. Фактический объект переходит в кучу. Что происходит в стеке? Адрес объекта в куче. Программисты на С ++ назвали бы это указателем, но некоторые разработчики Java против слова «указатель». Без разницы. Просто узнайте, что адрес объекта идет в стек.

Так же:

int problems = 99;
String name = "Jay-Z";

a b*7ch aint one! [/g1]

Массив объект, поэтому он также попадает в кучу. А как насчет объектов в массиве? Они получают свое собственное пространство кучи, и адрес каждого объекта попадает внутрь массива.

JButton[] marxBros = new JButton[3];
marxBros[0] = new JButton("Groucho");
marxBros[1] = new JButton("Zeppo");
marxBros[2] = new JButton("Harpo");

marx brothers [/g2]

Итак, что передается, когда вы вызвать метод? Если вы передаете объект, то, что вы фактически передаете, является адресом объекта. Некоторые могут сказать «значение» адреса, а некоторые говорят, что это просто ссылка на объект. Это генезис священной войны между «ссылочными» и «ценностными» сторонниками. То, что вы называете это, не так важно, как вы понимаете, что то, что передается, - это адрес объекта.

private static void shout(String name){
    System.out.println("There goes " + name + "!");
}

public static void main(String[] args){
    String hisName = "John J. Jingleheimerschmitz";
    String myName = hisName;
    shout(myName);
}

Создается одна строка, а пространство для нее выделяется в куче и адрес строки сохраняется в стеке и задается идентификатор hisName, так как адрес второй строки такой же, как и первый, новая String не создается и не выделяется новое пространство кучи, но новый идентификатор созданный в стеке. Затем мы вызываем shout(): создается новый стек стека и создается новый идентификатор name и назначается адрес уже существующей строки.

la da di da da da da [/g3]

Итак, значение, ссылка? Вы говорите «картофель».

389
задан Cœur 4 April 2017 в 10:35
поделиться

12 ответов

docs описывают атрибуты, доступные в запросе. В большинстве случаев request.data будет пустым, потому что он используется как резерв:

request.data Содержит входящие данные запроса как строку, если он пришел с типом mimetype Flask не обрабатывается.

  • request.args: пары ключ / значение в строке запроса URL
  • request.form: пары ключ / значение в теле, из HTML почтовая форма или запрос JavaScript, который не закодирован JSON
  • request.files: файлы в теле, которые Flask хранятся отдельно от form. HTML-формы должны использовать enctype=multipart/form-data или файлы не будут загружены.
  • request.values: объединены args и form, предпочитая args, если клавиши перекрываются

Все это MultiDict экземпляры. Вы можете получить доступ к значениям, используя:

  • request.form['name']: используйте индексирование, если знаете ключ существует
  • request.form.get('name'): используйте get, если ключ может отсутствовать
  • request.form.getlist('name'): используйте getlist, если ключ отправляется несколько раз и вам нужен список значений. get возвращает только первое значение.
628
ответ дан davidism 16 August 2018 в 03:03
поделиться
  • 1
    Примечание: Чтобы получить полезную нагрузку в качестве JSON, вы можете использовать request.get_json(). – albert 8 February 2016 в 10:51
  • 2
    Добавляя к комментарию @ albert, можно использовать request.get_json(force=True). Из документации: force – if set to True the mimetype is ignored., поэтому она не вернет None для запросов, у которых нет application/json, установленных в заголовке contentType. – plsnoban 5 July 2016 в 16:48
  • 3
    @ fujianjin6471: см. docs здесь – albert 21 January 2018 в 19:10
  • 4
    Кроме того, вы можете или должны проверить, существует ли ключ, прежде чем пытаться его получить: if 'some_value' in request.get_json(): actualValue = request.get_json()['some_value'] – manatico 8 March 2018 в 19:33
  • 5
    Это должно быть самой неприятной особенностью для меня в Flask: я просто хочу получить тело запроса, и все. И фляжка как веб-сервер не может этого сделать, нет, она поместит ее в другое место с другим форматом, который я должен угадывать, используя много if – Tyler Temp 17 July 2018 в 13:40
from flask import Flask, request, jsonify

@app.route('/added', methods=['POST'])
def add():
    data = request.get_json(force=True)
    l = {'name': data['name']}
    lingual.append(l)

    return jsonify({'lang': lingual})
-1
ответ дан aakash gupta 16 August 2018 в 03:03
поделиться
  • 1
    когда вы получаете необработанные данные, используя метод post в колбе, используйте request.get_json (force = True) – aakash gupta 21 July 2018 в 22:51
  • 2
    Вы должны объяснить свой код и как он решает вопрос OP. – Nic3500 22 July 2018 в 01:33
from flask import request
request.data
161
ответ дан clyfish 16 August 2018 в 03:03
поделиться
len = request.headers["Content-Length"]
data=request.stream.read()

Теперь данные являются телом запроса

4
ответ дан Daniel 16 August 2018 в 03:03
поделиться

Это просто следующее

Для параметра URL Query, используйте request.args

search = request.args.get("search")
page = request.args.get("page")

Для ввода формы используйте request.form

email = request.form.get('email')
password = request.form.get('password')

Для приложения типа данных / json используйте request.data

# data in string format and you have to parse into dictionary
data = request.data
dataDict = json.loads(data)
120
ответ дан Fizer Khan 16 August 2018 в 03:03
поделиться

Использование request.form.

Вместо получения данных одной формы (request.form["field_name"]) вы можете получить все опубликованные данные, проанализировав ImmutableDict, предоставленный объектом request.form, например :

Flask (Route)

@app.route('/data', methods=['POST'])                                           
def f_data():                                                                   
    if request.method == "POST":
        fields = [k for k in request.form]                                      
        values = [request.form[k] for k in request.form]
        data = dict(zip(fields, values))
    return jsonify(data) 

Shell

$ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
{
  "name": "ivanleoncz", 
  "role": "Software Developer"
}

Подробнее см. Gist .

1
ответ дан ivanleoncz 16 August 2018 в 03:03
поделиться

Flask имеет еще один ярлык для JSON:

Заголовок:

{Content-Type: application/json}

@app.route("/something", methods=["POST"])
def do_something():
    data = request.get_json()
21
ответ дан Jochem Schulenklopper 16 August 2018 в 03:03
поделиться

Я даю полный пример приложения / json:

from flask import Flask, abort, request 
import json

app = Flask(__name__)


@app.route('/foo', methods=['POST']) 
def foo():
    if not request.json:
        abort(400)
    print request.json
    return json.dumps(request.json)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

использовать Postman для почтового запроса:

использовать команду curl:

curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo

PS Для примера параметра URL-запроса вы можете увидеть мой ответ в Несколько параметров в флажке одобрить

42
ответ дан kaushal agrawal 16 August 2018 в 03:03
поделиться
  • 1
    Зачем вам использовать request.json, если вы все-таки конвертируете его с json.dumps()? – nyuszika7h 11 December 2016 в 22:21
  • 2
    @ nyuszika7h, не для какого-либо практического применения, а только для показа результата. – Jochem Schulenklopper 10 November 2017 в 16:32

В javascript:

var value_data = [1,2,3,4];

$.ajax({
        type: 'POST',
        url: '/',
        data:JSON.stringify(value_data),
        success: function (response) {
            alert("Data added successfully");
         },    
});

В python:

client_data = request.get_data()
1
ответ дан Syscall 16 August 2018 в 03:03
поделиться
@app.route('/', methods=['POST'])
def process_data():
    req_data = request.get_json(force=True) # force=True will make sure this works even if a client does not specify application/json
    language = req_data['language'] # or whatever key you have in your json

    return '''The language value is: {}'''.format(language)
4
ответ дан Tarik Fojnica 16 August 2018 в 03:03
поделиться
  • 1
    Хотя этот код может ответить на вопрос, было бы лучше включить некоторый контекст, объяснив, как он работает и когда его использовать. Ответы только на код не полезны в долгосрочной перспективе. Как ваш ответ отличается от других? – Maximilian Peters 25 March 2018 в 19:58
  • 2
    Вы прав насчет документирования, я немного обновил свои комментарии. Почему мой ответ отличается от других? Просто потому, что это прямолинейно. Я написал только то, что спросил ОП, и он работает без каких-либо дополнительных вопросов. – Tarik Fojnica 25 March 2018 в 21:00

, если вы хотите, чтобы исходное тело было независимо от типа содержимого, вы должны использовать request.get_data(), потому что request.form преобразуется в формат werkzeug.ImmutableMultiDict.

14
ответ дан Xiao 16 August 2018 в 03:03
поделиться

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

@app.before_request
def before_request():
    g.data = request.get_json() or request.values

Теперь g.data является экземпляром werkzeug.ImmutableMultiDict. Затем вы можете использовать g.data, который может справиться с большинством ваших требований. Например, вы можете использовать его так:

@app.route("/something", methods=["POST"])
def do_something():
    result = handle(g.data)
    return jsonify(data=result)

Конечно, вы можете использовать blueprint вместо app ~~

6
ответ дан zhangqy 16 August 2018 в 03:03
поделиться
Другие вопросы по тегам:

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