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ć.
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
Więc naprawdę będziesz musiał wybrać jeden z tych frameworków.
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.
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:
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")
-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.
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.
„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.
Odpowiedzi:
załóżmy, że wysyłasz formularz html z tym:
Jeśli używasz surowego cgi :
Jeśli używasz Django , Pylonów , Flask lub Pyramid :
Korzystanie TurboGears , CherryPy :
Web.py :
Werkzeug :
Jeśli używasz Cherrypy lub Turbogears, możesz również zdefiniować swoją funkcję obsługi, pobierając parametr bezpośrednio:
Google App Engine :
Więc naprawdę będziesz musiał wybrać jeden z tych frameworków.
źródło
import cgi
, prawdaprint form["username"].value
?Bottle
które moim zdaniem używawsgi
, 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.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,
$_GET
a$_POST
także zmienne wygody. Są one analizowane odpowiednio z QUERY_URI i php: //.W Pythonie te funkcje byłyby
os.getenv('QUERY_STRING')
isys.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:
i dla POST:
Możesz teraz uzyskać dostęp do pól w następujący sposób:
Muszę też zaznaczyć, że moduł CGI nie działa dobrze. Rozważ to żądanie HTTP:
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.źródło
AttributeError: 'NoneType' object has no attribute 'split'
używamCGI
zPython
2.7POST.get('user_name', 'default_value')
.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ć:
źródło
http://www.myserver.com/cgi-bin/cgi.py/ThisIsMyMethod
. Powiązane są następujące zmienne środowiskowe : pobierająceos.environ.get('PATH_INFO')
nazwę metody (np.: / ThisIsMyMethod) ios.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.Są one przechowywane w obiekcie CGI fieldstorage.
źródło
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
źródło
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.
źródło