Как в Python обрабатываются переменные POST и GET?

В PHP вы можете просто использовать $_POST для переменных POST и $_GET для переменных GET (строка запроса). Что эквивалентно в Python?

Вы пишете приложение CGI-скрипт, mod_python или Django (или другой фреймворк)? Ответ зависит от дополнительной информации ...

Rob 21.01.2009 07:03

вы можете предоставить образец кода для каждого из них?

Click Upvote 21.01.2009 07:26

CGI, mod_python, Django, CherryPy и Pylons не являются образцами кода. Это веб-фреймворки Python, которые обрабатывают GET и POST. Для получения информации см. wiki.python.org/moin/WebFrameworks. На ваш вопрос - как и на заданный - невозможно ответить.

S.Lott 21.01.2009 14:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
139
3
188 209
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Это в некоторой степени зависит от того, что вы используете в качестве фреймворка CGI, но они доступны в словарях, доступных программе. Я бы указал вам на документы, но сейчас я не перехожу на python.org. Но эта заметка на mail.python.org даст вам первый указатель. Посмотрите библиотеки CGI и URLLIB Python, чтобы узнать больше.

Обновлять

Хорошо, эта ссылка разорвана. Вот базовая ссылка WSGI

Если вы недостаточно амбициозны, чтобы перейти по ссылке, я недостаточно амбициозен, чтобы вырезать и вставить его по ссылке.

Charlie Martin 21.01.2009 20:37

а теперь ссылка мертва, и поэтому все ненавидят подобные ответы и голосуют против них. Поздравляю.

John Tyree 05.10.2014 23:02

Знаете, каждый раз, когда я получаю комментарий от кого-то, кто сквернословит, что в ответе пяти-шестилетней давности теперь неработающая ссылка, без, скажем, добавления заменяющей ссылки, я могу поспорить, что это кто-то с репутацией <1000.

Charlie Martin 06.10.2014 00:19

Если бы я знал, где искать заменяющую ссылку (подсказка, я не знал, потому что ваша ссылка не работает), я бы не стал искать этот вопрос.

John Tyree 06.10.2014 03:56

Я полагаю, вы мог всегда пробуете подсказку насчет «CGI и URLLIB python libs».

Charlie Martin 06.10.2014 20:34

Python - это всего лишь язык, для получения данных GET и POST вам понадобится веб-фреймворк или инструментарий, написанный на Python. Как отмечает Чарли, Django является одним из них, а стандартные модули cgi и urllib - другими. Также доступны Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi и т. д. И т. Д.

В Django ваши функции просмотра получают аргумент запроса, который имеет request.GET и request.POST. Другие фреймворки будут делать это иначе.

«чтобы получить данные GET и POST, вам понадобится веб-фреймворк или инструментарий, написанный на Python» - просто неправда

James Tomasino 30.07.2013 19:42

Я согласен с Джеймсом, если они написаны на Python, их можно явно переписать по своему усмотрению.

Robin Sandström 18.08.2014 23:53

Хорошо, я новичок в Python, и я подумал, что невозможно использовать фреймворк. Мой вопрос в том, что это за способ? Я не использую никакой фреймворк, и у меня apache2 обслуживает скрипт Python. Было бы неплохо показать такой простой способ, как использование $ _GET или $ _POST в php.

black sensei 08.09.2014 15:07

@JamesTomasino В контексте вопроса это правда.

peterh 23.11.2016 11:51

Они хранятся в объекте fieldstorage CGI.

import cgi
form = cgi.FieldStorage()

print "The user entered %s" % form.getvalue("uservalue")

-1. существует довольно много представлений объекта запроса, в зависимости от используемых библиотек / фреймворка.

bruno desthuilliers 21.01.2009 12:42

Я не уверен, почему вы сделали -1. То есть то, что я дал, работает. Возможно, он не может использовать фреймворк. Кроме того, разве большинство фреймворков не используют это просто в фоновом режиме?

Evan Fosmark 21.01.2009 23:37

Было глупо сделать -1, у меня есть +1, чтобы сбалансировать его, плюс я думаю, что это лучший метод, так как он возвращает жало (что и просили)

joedborg 24.09.2012 19:55

@Liam Не уверен, почему вы получаете None, но этому посту более 6 лет, поэтому я не сомневаюсь, что что-то изменилось.

Evan Fosmark 17.06.2015 19:41

@EvanFosmark Я получаю значения None, используя это. Когда я печатаю значение, возвращенное cgi.FeildStorage, это то, что выводит FieldStorage (None, None, []). Я разместил здесь полный вопрос stackoverflow.com/questions/38024516/… Любая помощь будет принята с благодарностью.

Chor Sipahi 25.06.2016 06:50
Ответ принят как подходящий

предположим, вы публикуете html-форму со следующим:

<input type = "text" name = "username">

При использовании сырые cgi:

import cgi
form = cgi.FieldStorage()
print form["username"]

При использовании Джанго, Пилоны, Колба или Пирамида:

print request.GET['username'] # for GET form method
print request.POST['username'] # for POST form method

Использование Турбовинтовые, Вишня:

from cherrypy import request
print request.params['username']

Web.py:

form = web.input()
print form.username

Werkzeug:

print request.form['username']

Если вы используете Cherrypy или Turbogears, вы также можете определить свою функцию-обработчик, напрямую взяв параметр:

def index(self, username):
    print username

Google App Engine:

class SomeHandler(webapp2.RequestHandler):
    def post(self):
        name = self.request.get('username') # this will get the value from the field named username
        self.response.write(name) # this will write on the document

Так что вам действительно придется выбрать один из этих фреймворков.

Используя import cgi, разве это не print form["username"].value?

J. Katzwinkel 18.02.2013 04:20

Я использую Bottle, который, как мне кажется, использует wsgi, может ли кто-нибудь опубликовать эквивалент для использования в этом сценарии? Приведенный выше ответ - самое ясное объяснение, с которым я столкнулся, он просто не включает мой сценарий.

user1063287 21.09.2013 16:16

FieldStorage в python3 не работает, у вас могут возникнуть проблемы с ним. bugs.python.org/issue6234

NuclearPeon 01.10.2013 04:09

Позвольте мне уточнить мой предыдущий комментарий; эта страница: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode лучше это объясняет. Не используйте FieldStorage () в python 3 из-за проблем с кодировкой.

NuclearPeon 08.07.2014 00:44

Для Flask все немного иначе: request.args.get ('username')

Damjan Pavlica 04.01.2015 01:58

@NuclearPeon У меня тоже проблемы с python 2.7.6. Когда я печатаю значение, возвращенное cgi.FeildStorage, это то, что выводит FieldStorage (None, None, []). Я разместил здесь полный вопрос stackoverflow.com/questions/38024516/…

Chor Sipahi 25.06.2016 06:44

Я нашел ответ nosklo очень обширным и полезным! Для тех, кто, как и я, может найти прямой доступ к необработанным данным запроса также полезным, я хотел бы добавить способ сделать это:

import os, sys

# the query string, which contains the raw GET data
# (For example, for http://example.com/myscript.py?a=b&c=d&e
# this is "a=b&c=d&e")
os.getenv("QUERY_STRING")

# the raw POST data
sys.stdin.read()

Я пытаюсь использовать вызвать метод в файле cgi. Пример URL-адреса - http://www.myserver.com/cgi-bin/cgi.py/ThisIsMyMethod. Связаны следующие переменные среды: os.environ.get('PATH_INFO'), который получает имя метода (например: / ThisIsMyMethod), и os.environ.get('SCRIPT_NAME'), который предоставляет путь к сценарию из корневой папки веб-хоста (например: /cgi-bin/cgi.py). В моем случае QUERY_STRING пусто, так как я использую POST.

NuclearPeon 08.07.2014 00:52

Я знаю, что это старый вопрос. И все же удивительно, что не было дано хорошего ответа.

Во-первых, вопрос вполне актуален без упоминания фреймворка. КОНТЕКСТ - это эквивалент языка PHP. Хотя есть много способов получить параметры строки запроса в Python, переменные фреймворка просто заполнены. В PHP $_GET и $_POST также являются вспомогательными переменными. Они анализируются из входных данных QUERY_URI и php: // соответственно.

В Python этими функциями были бы os.getenv('QUERY_STRING') и sys.stdin.read(). Не забудьте импортировать модули os и sys.

Мы должны быть осторожны со словом «CGI» здесь, особенно когда говорим о двух языках и их общих чертах при взаимодействии с веб-сервером. 1. CGI, как протокол, определяет механизм передачи данных в протоколе HTTP. 2. Python можно настроить для работы как CGI-скрипт в Apache. 3. Модуль CGI в Python предлагает некоторые удобные функции.

Поскольку протокол HTTP не зависит от языка и что расширение Apache CGI также не зависит от языка, получение параметров GET и POST должно иметь только синтаксические различия между языками.

Вот процедура Python для заполнения словаря GET:

GET = {}
args=os.getenv("QUERY_STRING").split('&')

for arg in args: 
    t=arg.split('=')
    if len(t)>1: k,v=arg.split('='); GET[k]=v

и для POST:

POST = {}
args=sys.stdin.read().split('&')

for arg in args: 
    t=arg.split('=')
    if len(t)>1: k, v=arg.split('='); POST[k]=v

Теперь вы можете получить доступ к следующим полям:

print GET.get('user_id')
print POST.get('user_name')

Я также должен отметить, что модуль CGI плохо работает. Рассмотрим этот HTTP-запрос:

POST / test.py?user_id=6

user_name=Bob&age=30

Использование CGI.FieldStorage().getvalue('user_id') вызовет исключение с нулевым указателем, поскольку модуль слепо проверяет данные POST, игнорируя тот факт, что запрос POST может также содержать параметры GET.

Я получил эту ошибку: AttributeError: 'NoneType' object has no attribute 'split' с использованием CGI с Python 2.7

candlejack 17.07.2016 23:02

По поводу ошибки @candlejack сказал, попробуйте получить аргументы вроде этого POST.get('user_name', 'default_value').

George Siggouroglou 20.03.2018 19:31

@GeorgeSiggouroglou "default_value" решила мою проблему. Спасибо!

umbe1987 12.03.2019 16:35

Определенно мой любимый ответ на данный момент! +1

umbe1987 12.03.2019 16:36

QUERY_STRING не является допустимым индексом на Mac

Samuel Ev 14.05.2020 05:10

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