Я работаю над формой с двумя кнопками отправки.
Согласно этот ТАК принятый ответ, можно было узнать, какая кнопка отправки была нажата в PHP, выполнив что-то вроде:
<input type = "submit" name = "publish" value = "Publish">
<input type = "submit" name = "save" value = "Save">
<?php
if (isset($_POST['publish'])) {
# Publish-button was clicked
}
elseif (isset($_POST['save'])) {
# Save-button was clicked
}
?>
Теперь мне нужно сделать то же самое с Python, если это возможно. В настоящее время я получаю значения POSTed, например:
POST = {}
args=sys.stdin.read().split('&')
for arg in args:
t=arg.split('=')
if len(t)>1: k, v=arg.split('='); POST[k]=v
Однако при этом я могу узнать только значения моей формы, а не если они были действительно установлены.
Что-то вроде if POST.get('publish', 'default_value') всегда будет оцениваться как True, так как в моей форме его значение (Publish) установлено.
Что я могу сделать, чтобы имитировать набор PHP? есть ли способ сделать это на Python, желательно без феймворков?
РЕДАКТИРОВАТЬ
После комментария @04FS я провел простой тест, чтобы проверить, верно ли мое предположение, и действительно ли оно так.
Это мой тест. Я нажимаю одну из двух кнопок, но, несмотря ни на что, получаю:
import sys
import cgi
import cgitb
cgitb.enable()
print ("Content-type: text/html\n\n")
# https://stackoverflow.com/a/27893309/1979665
POST = {}
args=sys.stdin.read().split('&')
for arg in args:
t=arg.split('=')
if len(t)>1: k, v=arg.split('='); POST[k]=v
if POST.get('publish', 'default_value'):
print("<p>Publish was pressed</p>")
if POST.get('save', 'default_value'):
print("<p>Save was pressed</p>")
Результат:
Publish was pressed
Save was pressed
@ 04FS спасибо за ваше наблюдение, я еще раз протестирую код и проверю, действительно ли код оценивается как True, хотя я не нажимал кнопку публикации сообщения. это немного сложно отлаживать, но я разберусь с этим и обновлю свои выводы. Спасибо.
@04FS Только что проверил, кажется, я не могу сказать, какая кнопка была нажата, я обновлю свой вопрос с результатом.
Я думаю, ваша ошибка в том, что вы указываете здесь значение по умолчанию. Если во входных данных не было задано publish, то у вас сделай это имеет значение default_value. Это истинное значение y, когда вы проверяете его через if, поэтому вы получаете оба выхода. Вам нужен только POST.get('publish') — который либо возвращает значение, если параметр действительно существует, либо null/false/что угодно (не знаю деталей этого в python), если это не так.
Ага, так и получилось! Спасибо! Очевидно, я разместил это default_value , не особо задумываясь об этом. Если вы хотите опубликовать свой комментарий в качестве ответа, я буду более чем счастлив принять его!






Ошибка здесь заключалась в том, что вы указываете значение по умолчанию в вызове метода get. Если во входных данных не было задано publish, то POST.get('publish', 'default_value') возвращает default_value. Это истинное значение, когда вы проверяете его через if, поэтому вы получаете оба вывода, независимо от того, какая из этих кнопок была на самом деле нажата для отправки формы.
Здесь вам нужен только POST.get('publish'), который либо возвращает значение, если параметр действительно существует, либо null/false/что угодно (не знаю деталей этого в python), если это не так.
это очень эффективный метод для обработки нескольких кнопок отправки в Фляга питона.
Внешний интерфейс:
<form method = "POST" enctype = "multipart/form-data">
<input type = "submit" name = "action" value = "upload">
<input type = "submit" name = "action" value = "download">
<input type = "submit" name = "action" value = "next">
</form>
Бэкэнд:
if request.form['action'] == 'upload':
return 'upload pressed'
elif request.form['action'] == 'download':
return 'download pressed'
elif request.form['action'] == 'next':
return 'next pressed'
publishне была нажата, то она не становится частью набора данных для отправки формы.