Як обробляються змінні POST та GET в Python?


135

У PHP ви можете просто використовувати $_POSTдля POST та $_GETGET (рядок запиту) змінних. Який еквівалент у Python?


Ви пишете сценарій CGI, mod_python або додаток Django (або інший фреймворк)? Відповідь залежить від трохи більшої інформації ...
Роб

Ви можете надати зразок коду для кожного з них?
Клацніть Upvote

2
CGI, mod_python, Django, CherryPy та Pylons - не зразки коду. Вони є веб-рамками Python, які обробляють GET та POST. Для отримання інформації див. Wiki.python.org/moin/WebFrameworks . На ваше запитання - як на запитання - не можна відповісти.
S.Lott

Відповіді:


246

припустимо, ви надсилаєте форму 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

Використовуючи 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

Тож вам справді доведеться вибрати одну з цих рамок.


18
Використовуєте import cgi, чи не так print form["username"].value?
Дж. Кацвінкель

Я використовую те, Bottleщо, на мою думку, використовує wsgi, чи міг би хто-небудь розмістити еквівалент, використаний у цьому сценарії? Наведена вище відповідь є найяскравішим поясненням, з яким я зіткнувся, він просто не включає мій сценарій.
користувач1063287

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

2
Дозвольте мені уточнити мій попередній коментар; ця сторінка: lucumr.pocoo.org/2013/7/2/the-update-guide-to-unicode краще пояснює це. Не використовуйте FieldStorage () у python 3 через проблеми кодування.
NuclearPeon

Для колби це трохи інакше: request.args.get ('ім'я користувача')
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.


Я отримав цю помилку: AttributeError: 'NoneType' object has no attribute 'split'використовуючи CGIз Python2.7
candlejack

1
Про помилку @candlejack сказав, спробуйте отримати такі аргументи POST.get('user_name', 'default_value').
Джордж Сіґуроглоу

@GeorgeSiggouroglou Реч "default_value" вирішила мою проблему. Дякую!
umbe1987

1
Однозначно моя улюблена відповідь поки що! +1
umbe1987

QUERY_STRING - недійсний індекс для Mac
Samuel Ev

31

Я знайшов відповідь 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

28

Вони зберігаються в об'єкті CGI fieldstorage.

import cgi
form = cgi.FieldStorage()

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

2
-1. існує досить багато представлення об'єкта запиту, залежно від використовуваних libs / frame.
bruno desthuilliers

10
Я не впевнений, чому ти зробив -1. Я маю на увазі те, що я дав твори. Можливо, він не в змозі використовувати рамки. А також, чи не більшість фреймворків просто використовують це у фоновому режимі?
Еван Фосмарк

4
Дурне було робити -1, я поставив +1, щоб збалансувати це, плюс я думаю, що це найкращий метод, оскільки він повертає жало (про що і
вимагають

1
@Liam Не впевнений, чому ви отримуєте "None", але цій посаді більше 6 років, тому я б не сумнівався, чи все змінилося.
Еван Фосмарк

@EvanFosmark Я використовую це значення. Коли я друкую значення, повернене з cgi.FeildStorage, саме таким є вихід FieldStorage (None, None, []). Я розмістив повне запитання тут stackoverflow.com/questions/38024516/… Будь-яка допомога буде вдячна.
Чор Сіпахі

1

Це дещо залежить від того, що ви використовуєте як рамки CGI, але вони доступні в доступних для програми словниках. Я хотів би вказати на документи, але зараз я не проходжу до python.org. Але ця примітка на mail.python.org дасть вам перший покажчик . Подивіться на CGI та URLLIB Python libs для отримання додаткової інформації.

Оновлення

Гаразд, це посилання розбилося. Ось основна версія wsgi


Якщо ви недостатньо амбітні, щоб перейти за посиланням, я недостатньо амбітний вирізати та вставити, якщо з цього посилання.
Чарлі Мартін

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" - Просто неправда
James Tomasino

2
Я погоджуюся з Джеймсом, якщо вони написані на Python, вони можуть бути чітко написані знову за вашим бажанням.
Робін Сандстрьом

Гаразд, я новий учасник python, і я подумав, що це неможливо, що мені доведеться використовувати фреймворк. Моє питання в тому, що це так? Я не використовую жодної основи, і мені довелося apache2 обслуговувати сценарій python. Буде добре показувати мертвий простий спосіб, як використання $ _GET або $ _POST у php.
чорний сенсей

1
@JamesTomasino У контексті питання це правда.
peterh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.