Jak obsługiwane są zmienne POST i GET w Pythonie?


135

W PHP możesz po prostu użyć $_POSTdla $_GETzmiennych POST i GET (ciąg zapytania). Jaki jest odpowiednik w Pythonie?


Piszesz skrypt CGI, mod_python lub Django (lub inną aplikację frameworkową)? Odpowiedź zależy od nieco więcej informacji ...
Rob

czy możesz podać przykładowy kod dla każdego z nich?
Kliknij „Za głosowaniem”

2
CGI, mod_python, Django, CherryPy i Pylony nie są przykładami kodu. Są to struktury internetowe w języku Python obsługujące GET i POST. Więcej informacji można znaleźć na wiki.python.org/moin/WebFrameworks . Na Twoje pytanie - tak jak zostało zadane - nie można odpowiedzieć.
S.Lott,

Odpowiedzi:


246

załóżmy, że wysyłasz formularz html z tym:

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

Jeśli używasz surowego cgi :

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

Jeśli używasz Django , Pylonów , Flask lub Pyramid :

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

Korzystanie TurboGears , CherryPy :

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

Web.py :

form = web.input()
print form.username

Werkzeug :

print request.form['username']

Jeśli używasz Cherrypy lub Turbogears, możesz również zdefiniować swoją funkcję obsługi, pobierając parametr bezpośrednio:

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

Więc naprawdę będziesz musiał wybrać jeden z tych frameworków.


18
Używając import cgi, prawda print form["username"].value?
J. Katzwinkel,

Używam, Bottlektóre moim zdaniem używa wsgi, czy ktokolwiek mógłby opublikować odpowiednik użycia w tym scenariuszu? Powyższa odpowiedź jest najjaśniejszym wyjaśnieniem, z jakim się spotkałem, po prostu nie obejmuje mojego scenariusza.
user1063287

2
FieldStorage jest uszkodzony w pythonie3, mogą wystąpić z nim problemy. bugs.python.org/issue6234
NuclearPeon

2
Pozwólcie, że wyjaśnię mój poprzedni komentarz; ta strona: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode lepiej to wyjaśnia. Nie używaj FieldStorage () w Pythonie 3 z powodu problemów z kodowaniem.
NuclearPeon

W przypadku Flaska jest trochę inaczej: request.args.get ('nazwa użytkownika')
Damjan Pavlica,

35

Wiem, że to stare pytanie. Zaskakujące jest jednak to, że nie podano dobrej odpowiedzi.

Przede wszystkim pytanie jest całkowicie aktualne bez wspominania o ramach. KONTEKST jest odpowiednikiem języka PHP. Chociaż istnieje wiele sposobów uzyskania parametrów ciągu zapytania w Pythonie, zmienne struktury są po prostu wygodnie wypełniane. W PHP, $_GETa $_POSTtakże zmienne wygody. Są one analizowane odpowiednio z QUERY_URI i php: //.

W Pythonie te funkcje byłyby os.getenv('QUERY_STRING')i sys.stdin.read(). Pamiętaj, aby zaimportować moduły os i sys.

Musimy tutaj uważać na słowo "CGI", zwłaszcza gdy mówimy o dwóch językach i ich cechach wspólnych podczas interakcji z serwerem WWW. 1. CGI jako protokół definiuje mechanizm transportu danych w protokole HTTP. 2. Python można skonfigurować tak, aby działał jako skrypt CGI w Apache. 3. Moduł CGI w Pythonie oferuje kilka wygodnych funkcji.

Ponieważ protokół HTTP jest niezależny od języka, a rozszerzenie CGI Apache jest również niezależne od języka, pobieranie parametrów GET i POST powinno mieć tylko różnice składniowe w różnych językach.

Oto procedura Pythona do zapełniania słownika 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

i dla 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

Możesz teraz uzyskać dostęp do pól w następujący sposób:

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

Muszę też zaznaczyć, że moduł CGI nie działa dobrze. Rozważ to żądanie HTTP:

POST / test.py?user_id=6

user_name=Bob&age=30

Użycie CGI.FieldStorage().getvalue('user_id')spowoduje wyjątek wskaźnika zerowego, ponieważ moduł ślepo sprawdza dane POST, ignorując fakt, że żądanie POST może również przenosić parametry GET.


Mam ten błąd: AttributeError: 'NoneType' object has no attribute 'split'używam CGIz Python2.7
Candlejack

1
O błędzie, który powiedział @candlejack, spróbuj zebrać argumenty w ten sposób POST.get('user_name', 'default_value').
George Siggouroglou,

@GeorgeSiggouroglou Problem „default_value” rozwiązał mój problem. Dzięki!
umbe1987

1
Jak dotąd zdecydowanie moja ulubiona odpowiedź! +1
umbe1987

QUERY_STRING nie jest prawidłowym indeksem na Macu
Samuel Ev

31

Uważam, że odpowiedź nosklo jest bardzo obszerna i użyteczna! Dla tych, takich jak ja, dla których bezpośredni dostęp do nieprzetworzonych danych żądania może być również przydatny, chciałbym dodać sposób, aby to zrobić:

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()

Próbuję wywołać metodę w pliku cgi. Przykładowy adres URL to http://www.myserver.com/cgi-bin/cgi.py/ThisIsMyMethod. Powiązane są następujące zmienne środowiskowe : pobierające os.environ.get('PATH_INFO')nazwę metody (np.: / ThisIsMyMethod) i os.environ.get('SCRIPT_NAME')zapewniające ścieżkę do skryptu z folderu głównego hosta internetowego (np.: /Cgi-bin/cgi.py). W moim przypadku QUERY_STRING jest puste, ponieważ używam POST.
NuclearPeon

28

Są one przechowywane w obiekcie CGI fieldstorage.

import cgi
form = cgi.FieldStorage()

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

2
-1. istnieje sporo reprezentacji obiektu żądania, w zależności od użytych bibliotek / frameworków.
bruno desthuilliers

10
Nie jestem pewien, dlaczego zrobiłeś -1. To znaczy to, co dałem, działa. Być może nie jest w stanie użyć frameworka. Poza tym, czy większość frameworków nie używa tego po prostu w tle?
Evan Fosmark

4
Byłem głupi, aby zrobić -1, mam +1, aby to zrównoważyć, a ponadto myślę, że to najlepsza metoda, ponieważ zwraca żądło (o co się prosi)
joedborg

1
@Liam Nie jestem pewien, dlaczego otrzymujesz Brak, ale ten post ma ponad 6 lat, więc nie wątpiłbym, że coś się zmieniło.
Evan Fosmark

@EvanFosmark Otrzymuję wartości None, używając tego. Kiedy drukuję wartość zwróconą z cgi.FeildStorage, to jest to, co jest wynikiem FieldStorage (None, None, []). Opublikowałem tutaj pełne pytanie stackoverflow.com/questions/38024516/ ... Każda pomoc będzie mile widziana.
Chor Sipahi

1

Zależy to w pewnym stopniu od tego, czego używasz jako frameworka CGI, ale są one dostępne w słownikach dostępnych dla programu. Skierowałbym cię do dokumentacji, ale nie przechodzę teraz do python.org. Ale ta notatka na mail.python.org da ci pierwszy wskazówkę . Więcej informacji znajdziesz w bibliotekach CGI i URLLIB Python.

Aktualizacja

Okej, ten link zerwany. Oto podstawowy ref. Wsgi


Jeśli nie jesteś na tyle ambitny, aby podążać za linkiem, nie jestem wystarczająco ambitny, aby wycinać i wklejać je z linku.
Charlie Martin

1
a teraz link jest martwy i dlatego wszyscy nienawidzą takich odpowiedzi i odrzucają je. Gratulacje.
John Tyree

2
Wiesz, za każdym razem, gdy dostaję komentarz od kogoś narzekającego, że odpowiedź sprzed pięciu - prawie sześciu lat ma teraz uszkodzony link, powiedzmy bez dodania linku zastępczego, mogę się założyć, że to ktoś z rep <1000.
Charlie Martin

Gdybym wiedział, gdzie znaleźć link zastępczy (wskazówka, nie zrobiłem, ponieważ twój link nie działa) nie szukałbym tego pytania.
John Tyree

Państwo mogli zawsze staram wskazówkę o 'CGI i urllib bibliotekami Pythona przypuszczam.
Charlie Martin

0

Python to tylko język, aby uzyskać dane GET i POST, potrzebujesz frameworka internetowego lub zestawu narzędzi napisanego w Pythonie. Django jest jednym z nich, jak wskazuje Charlie, standardowe moduły cgi i urllib to inne. Dostępne są również Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi itp.

W Django, funkcje widoku otrzymują argument żądania, który ma request.GET i request.POST. Inne frameworki zrobią to inaczej.


13
„aby uzyskać dane GET i POST, potrzebujesz frameworku internetowego lub zestawu narzędzi napisanego w Pythonie” - Po prostu nieprawda
James Tomasino

2
Zgadzam się z Jamesem, jeśli są napisane w Pythonie, można je wyraźnie napisać ponownie według własnych preferencji.
Robin Sandström

Ok, jestem nowy w Pythonie i pomyślałem, że nie może być możliwe, że muszę używać frameworka. Moje pytanie brzmi: jaki jest sposób? Nie używam żadnego frameworka i miałem apache2 obsługiwać skrypt w Pythonie. Fajnie będzie pokazać śmiertelnie prosty sposób, jak użycie $ _GET lub $ _POST w php.
czarny sensei

1
@JamesTomasino W kontekście pytania to prawda.
peterh - Przywróć Monikę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.