из вашего внешнего кода кажется, что вы отправляете почтовый запрос типа: application / x- www-form-urlencoded, что это запрос по умолчанию для формы html5. В вашем backend logi c вы пытаетесь получить входящие данные как json со следующим кодом request.json["username"]
. Вместо этого вы должны использовать request.form["username"]
или request.form.get("username", "")
.
Вот небольшое резюме:
request.args
: пары ключ / значение в строке запроса URL
request.form
: пары ключ / значение в теле, из формы сообщения HTML или JavaScript запроса, который не кодируется JSON. Файлы: файлы в теле, которое Flask хранит отдельно от формы. HTML формы должны использовать enctype = multipart / form-data, иначе файлы не будут загружены.
request.values
: объединенные аргументы и форма, предпочитая аргументы, если ключи перекрывают запрос. json: проанализировано JSON данных. Запрос должен иметь тип содержимого application / json или использовать request.get_ json (force = True), чтобы игнорировать тип содержимого.
request.files
: файлы в теле, которое Flask отделено от формы. HTML формы должны использовать enctype = multipart / form-data, иначе файлы не будут выгружены.
request.values
: объединенные аргументы и форма, предпочитая аргументы, если ключи перекрываются
request.json
: проанализированы JSON данные. Запрос должен иметь тип содержимого application / json или использовать request.get_ json (force = True), чтобы игнорировать тип содержимого.
Ваше поле ввода во внешнем коде должен выглядеть так:
<form onSubmit={this.login} method="post">
<p>
<label htmlFor="email">Email</label>
<input type="username" className="w3-input w3-border" id="username" name="username" />
</p>
<p>
<input type="submit" className="w3-button w3-blue" value="Login" />
</p>
</form>
Добавлены изменения:
method="post"
: метод по умолчанию в форме html 5 - GET name="username"
: в качестве нового атрибута для ввода input type="submit"
: вместо кнопки
Ваша серверная часть должна быть такой:
@app.route("/username", methods=['POST'])
def login():
username = request.form.get("username", "") # or request.form["username"]
return jsonify(username=username) # from flask import jsonify
Я советую вам использовать jsonify (), чтобы вернуть json данные.
Наконец, в вашем коде интерфейса, если вы хотите напечатать json ответ с собранным именем пользователя, следует обновить ваш код примерно так:
.post("/username", {
username: document.getElementById("username").value,
})
.then((res) => {
// JSON response is handled by a json() promises
return res.json().then( (data) => console.log(data));
});