ใน PHP คุณสามารถใช้$_POST
สำหรับ POST และ$_GET
สำหรับตัวแปร GET (Query string) อะไรที่เทียบเท่าใน Python?
ใน PHP คุณสามารถใช้$_POST
สำหรับ POST และ$_GET
สำหรับตัวแปร GET (Query string) อะไรที่เทียบเท่าใน Python?
คำตอบ:
สมมติว่าคุณกำลังโพสต์รูปแบบ 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
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
ใครสามารถโพสต์สิ่งที่เทียบเท่าเพื่อใช้ในสถานการณ์นั้นได้หรือไม่ คำตอบข้างต้นเป็นคำอธิบายที่ชัดเจนที่สุดที่ฉันเจอ แต่ไม่รวมถึงสถานการณ์ของฉัน
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ก็น่าแปลกใจที่ไม่มีคำตอบที่ดี
ก่อนอื่นคำถามนี้ใช้ได้อย่างสมบูรณ์โดยไม่ต้องพูดถึงกรอบ 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
กับ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 สำหรับข้อมูลเพิ่มเติม
อัปเดต
โอเคลิงก์นั้นหยุดทำงาน นี่คือการอ้างอิง wsgi พื้นฐาน
Python เป็นเพียงภาษาในการรับข้อมูล GET และ POST คุณต้องมีเว็บเฟรมเวิร์กหรือชุดเครื่องมือที่เขียนด้วย Python Django เป็นหนึ่งดังที่ Charlie ชี้ให้เห็นว่าโมดูลมาตรฐาน cgi และ urllib เป็นโมดูลอื่น ๆ นอกจากนี้ยังมี Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi ฯลฯ เป็นต้น
ใน Django ฟังก์ชั่นมุมมองของคุณรับอาร์กิวเมนต์คำร้องขอซึ่งมีการร้องขอรับและร้องขอโพสต์ กรอบอื่น ๆ จะทำแตกต่างกัน