не получить значение при нажатии кнопки html - PullRequest
0 голосов
/ 06 августа 2020

У меня есть кнопка, при нажатии которой просто нужно выполнить функцию javascript. Функция javascript возвращает строку, которую я намереваюсь захватить в бэкэнде flask. В настоящее время функция javascript выполняется onclick.

Код:

<form id='details'method="post">
     <input class="myButton" id="mybutton" type="submit" value="Save" onclick="getdata()">
     </input>
</form>

Код flask:

app.add_url_rule('/entry1', endpoint='entry1', view_func=new_data, methods=['GET', 'POST'] )

def new_data():
    if request.method == 'POST':
        details = request.form['details']
        print(details)

In flask, когда я Я даю request.forms ['детали'], я ничего не получаю. Я ожидаю получить возвращенные данные от getdata. Я почти уверен, что на стороне html есть проблема. Пожалуйста, посоветуйте.

Получил много комментариев по поводу того же, но это не исправляет ... просто интересно, есть ли другой способ справиться с этим, мне просто нужен текст, собранный при нажатии кнопки для передачи на python бэкэнд, это кажется довольно простым, но просто не могу этого сделать :( Спасибо

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Вы ничего не получаете в flask request.form ['details'] , потому что данные были отправлены с использованием javascript. Вам следует попробовать:

request.data  # if data was sent as plain text

или

request.get_json() # if data was sent as json
0 голосов
/ 06 августа 2020

# EDIT 2 проверьте этот ответ Здесь .

Я сообщаю здесь большую часть этого как справку:

  • [request.args] [2]: пары ключ / значение в строке запроса URL
  • [request.form] [3]: пары ключ / значение в теле, из формы сообщения HTML или JavaScript запрос, который не JSON закодирован
  • [request.files] [4]: ​​файлы в теле, которые Flask хранятся отдельно от form. HTML формы должны использовать enctype=multipart/form-data, иначе файлы не будут загружены.
  • [request.values] [5]: объединены args и form, предпочитая args, если ключи перекрываются
  • [request.json] [6]: проанализированы данные JSON. Запрос должен иметь тип содержимого application/json или использовать [request.get_json(force=True)] [7], чтобы игнорировать тип содержимого.

Все это [MultiDict] [8] экземпляров ( кроме json). Вы можете получить доступ к значениям, используя:

  • request.form['name']: используйте индексирование, если вы знаете, что ключ существует
  • request.form.get('name'): используйте get, если ключ может не существовать
  • request.form.getlist('name'): используйте getlist, если ключ отправляется несколько раз и вам нужен список значений. get возвращает только первое значение.

Сначала было бы полезно, если бы вы также добавили код flask. При этом добавьте это к тегу input:

<form id='details'method="post">
     <input class="myButton" name="details" id="mybutton" type="submit" value="Save" 
     onclick="getdata()">
 </input>
</form>

Итак, в основном у вас было поле 'name = ""'.

Затем в файле python используйте это:

request.form['details']

Еще лучше, если вы сохраните значение в переменной (очевидно, это зависит от вас, это просто предложение)

request_detail = request.form['details']

Также в теге формы вы можете захотеть добавьте поле 'action = ""'. Это зависит от того, как декоратор маршрута в flask.

Пример, если у вас это:

@app.route('/details)
def details():
    pass

Тогда ваша форма должна иметь это:

<form id='details'method="post" action="/details">

или

<form id='details'method="post" action="details">

EDIT

Попробуйте использовать обычный декоратор маршрута, чтобы узнать, исправляет ли он:

@app.route('/entry1', methods=['GET', 'POST'])
def new_data():
    if request.method == 'POST':
        details = request.form['details']
        print(details)
    return render_template('filename.html')

Если вы все еще хотите использовать add_url_rule, попробуйте следующее:

app.add_url_rule('/', 'entry1', view_func=new_data, methods=['GET', 'POST'] )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...