Python-эквивалент PHP isset($_POST)

Я работаю над формой с двумя кнопками отправки.

Согласно этот ТАК принятый ответ, можно было узнать, какая кнопка отправки была нажата в 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
«только в состоянии узнать значения моей формы, а не если они были действительно установлены» - понятия не имею, что вы имеете в виду. Если кнопка publish не была нажата, то она не становится частью набора данных для отправки формы.
04FS 14.03.2019 11:15

@ 04FS спасибо за ваше наблюдение, я еще раз протестирую код и проверю, действительно ли код оценивается как True, хотя я не нажимал кнопку публикации сообщения. это немного сложно отлаживать, но я разберусь с этим и обновлю свои выводы. Спасибо.

umbe1987 14.03.2019 11:20

@04FS Только что проверил, кажется, я не могу сказать, какая кнопка была нажата, я обновлю свой вопрос с результатом.

umbe1987 14.03.2019 11:32

Я думаю, ваша ошибка в том, что вы указываете здесь значение по умолчанию. Если во входных данных не было задано publish, то у вас сделай это имеет значение default_value. Это истинное значение y, когда вы проверяете его через if, поэтому вы получаете оба выхода. Вам нужен только POST.get('publish') — который либо возвращает значение, если параметр действительно существует, либо null/false/что угодно (не знаю деталей этого в python), если это не так.

04FS 14.03.2019 11:38

Ага, так и получилось! Спасибо! Очевидно, я разместил это default_value , не особо задумываясь об этом. Если вы хотите опубликовать свой комментарий в качестве ответа, я буду более чем счастлив принять его!

umbe1987 14.03.2019 11:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
1 444
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ошибка здесь заключалась в том, что вы указываете значение по умолчанию в вызове метода 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'

Другие вопросы по теме