ตัวแปร POST และ GET จัดการใน Python อย่างไร


137

ใน PHP คุณสามารถใช้$_POSTสำหรับ POST และ$_GETสำหรับตัวแปร GET (Query string) อะไรที่เทียบเท่าใน Python?


คุณกำลังเขียนสคริปต์ CGI, mod_python หรือ Django (หรือเฟรมเวิร์กอื่น ๆ ) หรือไม่? คำตอบขึ้นอยู่กับข้อมูลเพิ่มเติมเล็กน้อย ...
Rob

คุณสามารถให้รหัสตัวอย่างสำหรับแต่ละรหัสเหล่านี้ได้หรือไม่
Click Upvote

2
CGI, mod_python, Django, CherryPy และ Pylons ไม่ใช่ตัวอย่างโค้ด เป็น Python Web Framework ที่จัดการ GET และ POST ดูข้อมูลในwiki.python.org/moin/WebFrameworks คำถามของคุณ - ตามที่ถาม - ไม่สามารถตอบได้
ล็อตต์

คำตอบ:


249

สมมติว่าคุณกำลังโพสต์รูปแบบ html ด้วยสิ่งนี้:

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

หากใช้cgi ดิบ :

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

หากใช้Django , Pylons , FlaskหรือPyramid :

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

ดังนั้นคุณจะต้องเลือกหนึ่งในกรอบเหล่านั้นจริงๆ


19
ใช้import cgiไม่ใช่print form["username"].valueเหรอ?
J.Katzwinkel

ฉันกำลังใช้Bottleสิ่งที่ฉันเชื่อว่าใช้wsgiใครสามารถโพสต์สิ่งที่เทียบเท่าเพื่อใช้ในสถานการณ์นั้นได้หรือไม่ คำตอบข้างต้นเป็นคำอธิบายที่ชัดเจนที่สุดที่ฉันเจอ แต่ไม่รวมถึงสถานการณ์ของฉัน
user1063287

2
FieldStorage เสียใน python3 คุณอาจประสบปัญหา bugs.python.org/issue6234
NuclearPeon

2
ให้ฉันชี้แจงเกี่ยวกับความคิดเห็นก่อนหน้าของฉัน หน้านี้: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicodeอธิบายได้ดีกว่า อย่าใช้ FieldStorage () ใน python 3 เนื่องจากปัญหาการเข้ารหัส
NuclearPeon

สำหรับ Flask มันแตกต่างกันเล็กน้อย: request.args.get ('username')
Damjan Pavlica

35

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ก็น่าแปลกใจที่ไม่มีคำตอบที่ดี

ก่อนอื่นคำถามนี้ใช้ได้อย่างสมบูรณ์โดยไม่ต้องพูดถึงกรอบ CONTEXT เป็นการเทียบเท่าภาษา 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-script ใน 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')ข้อผิดพลาดดังกล่าวลองรับการขัดแย้งเช่นนี้
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) ในกรณีของฉัน QUERY_STRING ว่างเปล่าเนื่องจากฉันใช้ POST
NuclearPeon

28

ซึ่งจะถูกเก็บไว้ในวัตถุ CGI fieldstorage

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
@ เลียมไม่แน่ใจว่าทำไมคุณถึงไม่มี แต่โพสต์นี้มีอายุเกิน 6 ปีแล้วดังนั้นฉันจะไม่สงสัยว่าสิ่งต่างๆจะเปลี่ยนไปหรือไม่
Evan Fosmark

@EvanFosmark ฉันไม่ได้รับค่าใด ๆ จากการใช้สิ่งนี้ เมื่อฉันพิมพ์ค่าที่ส่งคืนจาก cgi.FeildStorage นี่คือผลลัพธ์คือ FieldStorage (ไม่มี, ไม่มี, []) ฉันได้โพสต์คำถามทั้งหมดที่นี่stackoverflow.com/questions/38024516/…ความช่วยเหลือใด ๆ จะได้รับการชื่นชม
ช. สิพาหิ

1

ค่อนข้างขึ้นอยู่กับสิ่งที่คุณใช้เป็นกรอบ CGI แต่มีอยู่ในพจนานุกรมที่เข้าถึงได้ในโปรแกรม ฉันจะชี้ให้คุณดูเอกสาร แต่ตอนนี้ฉันไม่ได้เข้าสู่ python.org แต่บันทึกนี้บน mail.python.org จะทำให้คุณมีตัวชี้เป็นครั้งแรก ดู CGI และ URLLIB Python libs สำหรับข้อมูลเพิ่มเติม

อัปเดต

โอเคลิงก์นั้นหยุดทำงาน นี่คือการอ้างอิง wsgi พื้นฐาน


หากคุณไม่ทะเยอทะยานพอที่จะติดตามลิงก์ฉันไม่ทะเยอทะยานพอที่จะตัดและวางหากจากลิงก์
Charlie Martin

1
และตอนนี้ลิงค์ก็ตายไปแล้วนั่นคือสาเหตุที่ทุกคนเกลียดคำตอบแบบนี้และโหวตให้คะแนนพวกเขา ยินดีด้วย.
John Tyree

2
คุณรู้ไหมว่าทุกครั้งที่ฉันได้รับความคิดเห็นจากใครบางคนที่ไม่พอใจคำตอบที่มีอายุห้า - เกือบหกปีตอนนี้มีลิงก์ที่ใช้งานไม่ได้โดยไม่ต้องพูดเพิ่มลิงก์แทนที่ฉันสามารถเดิมพันได้ว่าเป็นคนที่มีตัวแทน <1,000
Charlie Martin

ถ้าฉันรู้ว่าจะไปที่ใดสำหรับลิงก์ทดแทน (คำใบ้ฉันไม่ได้เป็นเพราะลิงก์ของคุณใช้ไม่ได้) ฉันจะไม่ค้นหาคำถามนี้
John Tyree

คุณสามารถลองใช้คำแนะนำเกี่ยวกับ 'CGI และ URLLIB python libs' ที่ฉันคิดได้เสมอ
Charlie Martin

0

Python เป็นเพียงภาษาในการรับข้อมูล GET และ POST คุณต้องมีเว็บเฟรมเวิร์กหรือชุดเครื่องมือที่เขียนด้วย Python Django เป็นหนึ่งดังที่ Charlie ชี้ให้เห็นว่าโมดูลมาตรฐาน cgi และ urllib เป็นโมดูลอื่น ๆ นอกจากนี้ยังมี Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi ฯลฯ เป็นต้น

ใน Django ฟังก์ชั่นมุมมองของคุณรับอาร์กิวเมนต์คำร้องขอซึ่งมีการร้องขอรับและร้องขอโพสต์ กรอบอื่น ๆ จะทำแตกต่างกัน


13
"เพื่อรับข้อมูล GET และ POST คุณต้องมีกรอบงานเว็บหรือชุดเครื่องมือที่เขียนด้วย Python" - ไม่จริง
James Tomasino

2
ฉันเห็นด้วยกับ James ถ้าพวกเขาเขียนด้วย Python พวกเขาสามารถเขียนได้อย่างชัดเจนอีกครั้งตามความต้องการของคุณเอง
Robin Sandström

โอเคฉันเป็นมือใหม่ใน python และฉันคิดว่าคงเป็นไปไม่ได้ที่ฉันจะต้องใช้กรอบ คำถามของฉันคือวิธีใดฉันไม่ได้ใช้เฟรมเวิร์กใด ๆ และฉันมี apache2 ให้บริการสคริปต์ python มันจะเป็นการดีที่จะแสดงวิธีง่ายๆที่ตายแล้วเช่นการใช้ $ _GET หรือ $ _POST ใน php
อาจารย์ดำ

1
@JamesTomasino ในบริบทของคำถามมันเป็นเรื่องจริง
peterh - คืนสถานะ Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.