POST에서 POST 및 GET 변수는 어떻게 처리됩니까?


135

PHP에서는 $_POSTPOST 및 $_GETGET (쿼리 문자열) 변수에 사용할 수 있습니다. 파이썬에서 동등한 것은 무엇입니까?


CGI 스크립트, mod_python 또는 Django (또는 다른 프레임 워크) 응용 프로그램을 작성하고 있습니까? 대답은 조금 더 많은 정보에 달려 있습니다 ...
Rob

각각에 대한 샘플 코드를 제공 할 수 있습니까?
Upvote를 클릭하십시오

2
CGI, mod_python, Django, CherryPy 및 Pylons는 코드 샘플이 아닙니다. 그것들은 GET과 POST를 처리하는 Python Web Frameworks입니다. 자세한 내용은 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

터보 기어 사용 , Cherrypy :

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

Web.py :

form = web.input()
print form.username

베르 체우 :

print request.form['username']

Cherrypy 또는 Turbogear를 사용하는 경우 매개 변수를 직접 사용하여 핸들러 함수를 정의 할 수도 있습니다.

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않습니까?
J. Katzwinkel

내가 사용 Bottle한다고 생각하는 것을 사용 wsgi하고 있습니다. 누구나 해당 시나리오에서 사용할 수있는 내용을 게시 할 수 있습니까? 위의 답변은 내가 본 가장 명확한 설명이며 내 시나리오는 포함하지 않습니다.
user1063287

2
python3에서 FieldStorage가 손상되어 문제가 발생할 수 있습니다. bugs.python.org/issue6234
NuclearPeon

2
이전 의견을 명확히 할 수 있습니다. 이 페이지 : lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode가 더 잘 설명합니다. 인코딩 문제로 인해 Python 3에서 FieldStorage ()를 사용하지 마십시오.
NuclearPeon

플라스크의 경우 조금 다릅니다 : request.args.get ( 'username')
Damjan Pavlica

35

나는 이것이 오래된 질문이라는 것을 안다. 그러나 좋은 대답이 없었다는 것은 놀라운 일입니다.

우선 모든 질문은 프레임 워크를 언급하지 않고 완전히 유효합니다. 컨텍스트는 PHP 언어와 동일합니다. 파이썬에서 쿼리 문자열 매개 변수를 얻는 방법은 많이 있지만 프레임 워크 변수는 편리하게 채워집니다. PHP에서, $_GET그리고 $_POST편리 변수도 있습니다. 그것들은 각각 QUERY_URI와 php : // input에서 파싱됩니다.

파이썬에서 이러한 함수는 os.getenv('QUERY_STRING')and sys.stdin.read()입니다. os 및 sys 모듈을 가져와야합니다.

여기서는 특히 웹 서버와 인터페이스 할 때 두 언어와 공통점에 대해 이야기 할 때 "CGI"라는 단어에주의해야합니다. 1. 프로토콜 인 CGI는 HTTP 프로토콜에서 데이터 전송 메커니즘을 정의합니다. 2. Python은 Apache에서 CGI 스크립트로 실행되도록 구성 할 수 있습니다. 3. 파이썬의 CGI 모듈은 몇 가지 편리한 기능을 제공합니다.

HTTP 프로토콜은 언어와 무관하며 Apache의 CGI 확장도 언어와 무관하므로 GET 및 POST 매개 변수를 가져 오면 언어마다 구문 차이 만 있어야합니다.

다음은 GET 사전을 채우는 Python 루틴입니다.

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 요청이 GET 매개 변수를 전달할 수 있다는 사실을 무시하고 모듈이 POST 데이터를 맹목적으로 검사하기 때문에을 사용 하면 널 포인터 예외가 발생합니다.


이 오류가 발생했습니다 : 2.7 과 함께 AttributeError: 'NoneType' object has no attribute 'split'사용CGIPython
촛대

1
@candlejack이 말한 오류에 대해 다음과 같은 인수를 사용해보십시오 POST.get('user_name', 'default_value').
George Siggouroglou

@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)에서 스크립트 경로를 제공합니다. 필자의 경우 POST를 사용하고 있으므로 QUERY_STRING이 비어 있습니다.
NuclearPeon

28

CGI 필드 저장소 개체에 저장됩니다.

import cgi
form = cgi.FieldStorage()

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

2
-1. 사용 된 libs / framework에 따라 요청 객체의 표현이 꽤 있습니다.
bruno desthuilliers

10
왜 -1을했는지 모르겠습니다. 내 말은, 내가 한 일을 의미합니다. 아마도 그는 프레임 워크를 사용할 수 없습니다. 또한 대부분의 프레임 워크가 백그라운드에서 이것을 사용하지 않습니까?
Evan Fosmark

4
어리석게도 -1을하고, 균형을 잡기 위해 +1을했으며, 이것이 찌르기 (요청한 것)를 반환 할 때 가장 좋은 방법이라고 생각합니다.
joedborg

1
@Liam 왜 None을 받고 있는지 잘 모르겠지만이 게시물은 6 세 이상이므로 변경 사항이 있는지 의심의 여지가 없습니다.
Evan Fosmark

@EvanFosmark 이것을 사용하여 None 값을 얻습니다. cgi.FeildStorage에서 반환 된 값을 인쇄하면 출력이 FieldStorage (None, None, [])입니다. 여기에 전체 질문을 게시했습니다. stackoverflow.com/questions/38024516/… 도움을 주시면 감사하겠습니다.
Chor Sipahi

1

CGI 프레임 워크로 사용하는 것에 따라 다소 차이가 있지만 프로그램에서 액세스 할 수있는 사전에서 사용할 수 있습니다. 나는 당신에게 문서를 지적 할 것이지만 지금은 python.org를 거치지 않습니다. 그러나 mail.python.org에있는이 노트는 첫 번째 포인터를 제공 할 것 입니다. 자세한 내용은 CGI 및 URLLIB Python 라이브러리를 참조하십시오.

최신 정보

좋아요, 그 링크가 파열되었습니다. 기본 wsgi ref 는 다음과 같습니다.


링크를 따라갈 야심이 없다면 링크에서 잘라내어 붙여 넣을만큼 야심 찬 것은 아닙니다.
찰리 마틴

1
이제 연결이 끊어 졌기 때문에 모든 사람들이 이와 같은 답변을 싫어하고 공감합니다. 축하합니다.
John Tyree

2
당신은 5 년에서 6 년 정도 된 답변에 대체 링크를 추가하지 않고 링크가 끊겼다는 의견을들을 때마다 rep <1000 인 사람에게 베팅 할 수 있습니다.
찰리 마틴

교체 링크를 어디로 갈지 알고 있다면 (링크가 작동하지 않아서 아닙니다)이 질문을 찾지 않았을 것입니다.
John Tyree

당신은 할 수 항상 'CGI와 URLLIB 파이썬 libs와'에 대한 힌트를 시도 나는 가정한다.
Charlie Martin

0

Python은 언어 일 뿐이므로 GET 및 POST 데이터를 얻으려면 Python으로 작성된 웹 프레임 워크 또는 툴킷이 필요합니다. Django는 Charlie가 지적했듯이 cgi 및 urllib 표준 모듈은 다른 모듈입니다. Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi 등도 사용할 수 있습니다.

Django에서 뷰 함수는 request.GET 및 request.POST가있는 요청 인수를받습니다. 다른 프레임 워크는 다르게 작동합니다.


13
"GET 및 POST 데이터를 얻으려면 Python으로 작성된 웹 프레임 워크 또는 툴킷이 필요합니다."-사실이 아님
James Tomasino

2
James에 동의합니다. Python으로 작성하면 자신의 취향에 따라 명확하게 다시 작성할 수 있습니다.
Robin Sandström

좋아, 나는 파이썬에서 새로 온 사람이며 프레임 워크를 사용해야 할 수 없다고 생각했다. 내 질문은 방법이 무엇입니까? 나는 프레임 워크를 사용하지 않고 apache2가 파이썬 스크립트를 제공하도록했습니다. PHP에서 $ _GET 또는 $ _POST 사용법으로 죽은 간단한 방법을 보여주는 것이 좋을 것입니다.
black sensei

1
@JamesTomasino 질문의 맥락에서 그것은 사실입니다.
peterh-복원 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.