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

135

В PHP вы можете просто использовать переменные $_POSTPOST и $_GETGET (строка запроса). Что эквивалентно в Python?

Нажмите Upvote
источник
Вы пишете CGI-скрипт, mod_python или Django (или другой фреймворк) приложение? Ответ зависит от немного больше информации ...
Роб
Можете ли вы предоставить пример кода для каждого из них?
Нажмите Upvote
2
CGI, mod_python, Django, CherryPy и Pylons не являются примерами кода. Это Python Web Framework, который обрабатывает GET и POST. Смотрите wiki.python.org/moin/WebFrameworks для информации. На ваш вопрос, как и было задано, ответить невозможно.
S.Lott

Ответы:

246

Предположим, вы публикуете HTML-форму с этим:

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

Если вы используете raw cgi :

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

При использовании Django , Pylons , Flask или Pyramid :

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

Используя Turbogears , Cherrypy :

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

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

nosklo
источник
18
Используете import cgi, не так ли print form["username"].value?
J. Katzwinkel
Я использую то, Bottleчто, по моему мнению, использует wsgi, может кто-нибудь опубликовать эквивалент для использования в этом сценарии? Приведенный выше ответ является самым ясным объяснением, с которым я столкнулся, просто он не включает мой сценарий.
user1063287
2
FieldStorage не работает в python3, могут возникнуть проблемы с ним. bugs.python.org/issue6234
NuclearPeon
2
Позвольте мне уточнить мой предыдущий комментарий; эта страница: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode лучше объясняет это. Не используйте FieldStorage () в Python 3 из-за проблем с кодировкой.
NuclearPeon
Для Flask это немного по-другому: request.args.get ('username')
Damjan Pavlica
35

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

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

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

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

Поскольку протокол HTTP не зависит от языка, а расширение CGI в Apache также не зависит от языка, получение параметров 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.

Schien
источник
Я получил эту ошибку: AttributeError: 'NoneType' object has no attribute 'split'использование CGIс Python2.7
подсвечник
1
Об ошибке @candlejack сказал, попробуйте получить такие аргументы POST.get('user_name', 'default_value').
Джордж Сиггуроглу
@ GeorgeSiggouroglou «default_value» решил мою проблему. Спасибо!
umbe1987
1
Определенно мой любимый ответ до сих пор! +1
umbe1987
QUERY_STRING - недопустимый индекс для Mac
Самуэль Эв
31

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

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
28

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

import cgi
form = cgi.FieldStorage()

print "The user entered %s" % form.getvalue("uservalue")
Эван Фосмарк
источник
2
-1. Есть довольно много представлений объекта запроса, в зависимости от используемой библиотеки / библиотеки.
Bruno Desthuilliers
10
Я не уверен, почему ты сделал -1. Я имею в виду, что я дал работы. Возможно, он не может использовать рамки. Кроме того, большинство фреймворков не используют это только в фоновом режиме?
Эван Фосмарк
4
Было глупо делать -1, у меня есть +1, чтобы уравновесить его, плюс я думаю, что это лучший метод, так как он возвращает жало (что и просили)
joedborg
1
@Liam Не знаю, почему вы получаете None, но этому посту более 6 лет, поэтому я не сомневаюсь, что все изменилось.
Эван Фосмарк,
@EvanFosmark Я получаю значения None, используя это. Когда я печатаю значение, возвращенное из cgi.FeildStorage, это то, что выводится FieldStorage (None, None, []). Я разместил полный вопрос здесь stackoverflow.com/questions/38024516/… Любая помощь будет оценена.
Чор Сипахи
1

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

Обновить

Хорошо, эта ссылка разорена. Вот основной wsgi ref

Чарли Мартин
источник
Если вы недостаточно амбициозны, чтобы перейти по ссылке, я недостаточно амбициозен, чтобы вырезать и вставить ссылку.
Чарли Мартин
1
и теперь ссылка мертва, и поэтому все ненавидят такие ответы и отрицают их. Поздравляю.
Джон Тайри
2
Вы знаете, каждый раз, когда я получаю комментарий от кого-то, кто ссорится, что у пяти - почти шестилетнего ответа теперь есть неработающая ссылка, без добавления, скажем, замены, я могу поспорить, что это кто-то с репутацией <1000.
Чарли Мартин
Если бы я знал, куда идти по ссылке для замены (подсказка, я не знал, потому что ваша ссылка не работала), я бы не стал искать этот вопрос.
Джон Тайри
Вы могли всегда попробовать подсказку о «CGI и URLLIB питона LIBS» Я полагаю.
Чарли Мартин
0

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

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

Нед Бэтчелдер
источник
13
«Чтобы получить данные GET и POST, вам нужен веб-фреймворк или инструментарий, написанный на Python» - просто не соответствует действительности
Джеймс Томазино
2
Я согласен с Джеймсом, если они написаны на Python, они могут быть снова написаны по вашему усмотрению.
Робин Сандстрем
Хорошо, я новичок в Python, и я подумал, что не может быть возможности использовать фреймворк. Мой вопрос в том, как это сделать? Я не использую никаких фреймворков, и у меня был apache2, обслуживающий скрипт на python. Было бы неплохо показать простой способ использования $ _GET или $ _POST в php.
черный сенсей
1
@JamesTomasino В контексте вопроса это правда.
Петер - Восстановить Монику