У PHP ви можете просто використовувати $_POST
для POST та $_GET
GET (рядок запиту) змінних. Який еквівалент у Python?
У PHP ви можете просто використовувати $_POST
для POST та $_GET
GET (рядок запиту) змінних. Який еквівалент у Python?
Відповіді:
припустимо, ви надсилаєте форму 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
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
?
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:
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
POST.get('user_name', 'default_value')
.
Я знайшов відповідь 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()
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.
import cgi
form = cgi.FieldStorage()
print "The user entered %s" % form.getvalue("uservalue")
Це дещо залежить від того, що ви використовуєте як рамки CGI, але вони доступні в доступних для програми словниках. Я хотів би вказати на документи, але зараз я не проходжу до python.org. Але ця примітка на mail.python.org дасть вам перший покажчик . Подивіться на CGI та URLLIB Python libs для отримання додаткової інформації.
Оновлення
Python - це лише мова, для отримання даних GET та POST потрібна веб-рамка або інструментарій, написаний на Python. Як зазначає Чарлі, Джанго - це інші модулі cgi та urllib. Також доступні: Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi тощо, тощо.
У Django ваші функції перегляду отримують аргумент запиту, який має request.GET та request.POST. Інші рамки зроблять це інакше.