Мне кажется, что спорить о «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;
приводит к этому:
[/g0]
Когда вы объявляете и создаете экземпляр объекта. Фактический объект переходит в кучу. Что происходит в стеке? Адрес объекта в куче. Программисты на С ++ назвали бы это указателем, но некоторые разработчики Java против слова «указатель». Без разницы. Просто узнайте, что адрес объекта идет в стек.
Так же:
int problems = 99;
String name = "Jay-Z";
[/g1]
Массив объект, поэтому он также попадает в кучу. А как насчет объектов в массиве? Они получают свое собственное пространство кучи, и адрес каждого объекта попадает внутрь массива.
JButton[] marxBros = new JButton[3];
marxBros[0] = new JButton("Groucho");
marxBros[1] = new JButton("Zeppo");
marxBros[2] = new JButton("Harpo");
[/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
и назначается адрес уже существующей строки.
[/g3]
Итак, значение, ссылка? Вы говорите «картофель».
docs описывают атрибуты, доступные в запросе. В большинстве случаев request.data
будет пустым, потому что он используется как резерв:
request.data
Содержит входящие данные запроса как строку, если он пришел с типом mimetype Flask не обрабатывается.
request.args
: пары ключ / значение в строке запроса URLrequest.form
: пары ключ / значение в теле, из HTML почтовая форма или запрос JavaScript, который не закодирован JSONrequest.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
возвращает только первое значение.
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})
len = request.headers["Content-Length"]
data=request.stream.read()
Теперь данные являются телом запроса
Это просто следующее
Для параметра 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)
Использование 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 .
Flask имеет еще один ярлык для JSON:
Заголовок:
{Content-Type: application/json}
@app.route("/something", methods=["POST"])
def do_something():
data = request.get_json()
Я даю полный пример приложения / 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-запроса вы можете увидеть мой ответ в Несколько параметров в флажке одобрить
request.json
, если вы все-таки конвертируете его с json.dumps()
?
– nyuszika7h
11 December 2016 в 22:21
В 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()
@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)
, если вы хотите, чтобы исходное тело было независимо от типа содержимого, вы должны использовать request.get_data()
, потому что request.form
преобразуется в формат werkzeug.ImmutableMultiDict
.
Проще говоря, вы можете получить данные следующим образом:
@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
~~
request.get_json()
. – albert 8 February 2016 в 10:51request.get_json(force=True)
. Из документации:force – if set to True the mimetype is ignored.
, поэтому она не вернетNone
для запросов, у которых нетapplication/json
, установленных в заголовкеcontentType
. – plsnoban 5 July 2016 в 16:48if 'some_value' in request.get_json(): actualValue = request.get_json()['some_value']
– manatico 8 March 2018 в 19:33if
– Tyler Temp 17 July 2018 в 13:40