Вы пишете CGI-скрипт, mod_python или Django (или другой фреймворк) приложение? Ответ зависит от немного больше информации ...
Роб
Можете ли вы предоставить пример кода для каждого из них?
Нажмите Upvote
2
CGI, mod_python, Django, CherryPy и Pylons не являются примерами кода. Это Python Web Framework, который обрабатывает GET и POST. Смотрите wiki.python.org/moin/WebFrameworks для информации. На ваш вопрос, как и было задано, ответить невозможно.
classSomeHandler(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
Я использую то, Bottleчто, по моему мнению, использует wsgi, может кто-нибудь опубликовать эквивалент для использования в этом сценарии? Приведенный выше ответ является самым ясным объяснением, с которым я столкнулся, просто он не включает мой сценарий.
Для 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
Теперь вы можете получить доступ к полям следующим образом:
Я также должен отметить, что модуль 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с 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")
-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, чтобы узнать больше.
Если вы недостаточно амбициозны, чтобы перейти по ссылке, я недостаточно амбициозен, чтобы вырезать и вставить ссылку.
Чарли Мартин
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. Другие рамки будут делать это по-другому.
«Чтобы получить данные GET и POST, вам нужен веб-фреймворк или инструментарий, написанный на Python» - просто не соответствует действительности
Джеймс Томазино
2
Я согласен с Джеймсом, если они написаны на Python, они могут быть снова написаны по вашему усмотрению.
Робин Сандстрем
Хорошо, я новичок в Python, и я подумал, что не может быть возможности использовать фреймворк. Мой вопрос в том, как это сделать? Я не использую никаких фреймворков, и у меня был apache2, обслуживающий скрипт на python. Было бы неплохо показать простой способ использования $ _GET или $ _POST в php.
Ответы:
Предположим, вы публикуете HTML-форму с этим:
Если вы используете raw cgi :
При использовании Django , Pylons , Flask или Pyramid :
Используя Turbogears , Cherrypy :
Web.py :
Werkzeug :
Если вы используете Cherrypy или Turbogears, вы также можете определить функцию-обработчик, принимающую параметр напрямую:
Google App Engine :
Так что вам действительно придется выбрать одну из этих платформ.
источник
import cgi
, не так лиprint form["username"].value
?Bottle
что, по моему мнению, используетwsgi
, может кто-нибудь опубликовать эквивалент для использования в этом сценарии? Приведенный выше ответ является самым ясным объяснением, с которым я столкнулся, просто он не включает мой сценарий.Я знаю, что это старый вопрос. И все же удивительно, что не было дано хорошего ответа.
Прежде всего, вопрос полностью актуален без упоминания основы. КОНТЕКСТ - это эквивалентность языка 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:
и для POST:
Теперь вы можете получить доступ к полям следующим образом:
Я также должен отметить, что модуль CGI не работает хорошо. Рассмотрим этот HTTP-запрос:
Использование
CGI.FieldStorage().getvalue('user_id')
приведет к исключению нулевого указателя, поскольку модуль вслепую проверяет данные POST, игнорируя тот факт, что запрос POST может также содержать параметры GET.источник
AttributeError: 'NoneType' object has no attribute 'split'
использованиеCGI
сPython
2.7POST.get('user_name', 'default_value')
.Я нашел ответ Носкло очень обширным и полезным! Для тех, кто, как и я, может найти доступ к необработанным данным запроса напрямую также полезным, я хотел бы добавить способ сделать это:
источник
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.Они хранятся в объекте CGI fieldstorage.
источник
Это в некоторой степени зависит от того, что вы используете в качестве CGI-фреймворка, но они доступны в словарях, доступных для программы. Я бы указал на документы, но сейчас я не перехожу на python.org. Но эта заметка на mail.python.org даст вам первый указатель . Посмотрите на библиотеки CGI и URLLIB Python, чтобы узнать больше.
Обновить
Хорошо, эта ссылка разорена. Вот основной wsgi ref
источник
Python - это всего лишь язык, для получения данных GET и POST вам нужен веб-фреймворк или инструментарий, написанный на Python. Джанго - один, как указывает Чарли, стандартные модули cgi и urllib - другие. Также доступны Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi и т. Д. И т. Д.
В Django ваши функции представления получают аргумент запроса, который имеет request.GET и request.POST. Другие рамки будут делать это по-другому.
источник