Trong PHP, bạn chỉ có thể sử dụng $_POST
cho các biến POST và $_GET
cho các biến GET (Chuỗi truy vấn). Python tương đương là gì?
Trong PHP, bạn chỉ có thể sử dụng $_POST
cho các biến POST và $_GET
cho các biến GET (Chuỗi truy vấn). Python tương đương là gì?
Câu trả lời:
giả sử bạn đang đăng một mẫu html với điều này:
<input type="text" name="username">
Nếu sử dụng cgi thô :
import cgi
form = cgi.FieldStorage()
print form["username"]
Nếu sử dụng Django , Pylons , Flask hoặc Pyramid :
print request.GET['username'] # for GET form method
print request.POST['username'] # for POST form method
Sử dụng Turbogears , Cherrypy :
from cherrypy import request
print request.params['username']
Web.py :
form = web.input()
print form.username
Werkzeug :
print request.form['username']
Nếu sử dụng Cherrypy hoặc Turbogears, bạn cũng có thể xác định hàm xử lý của mình lấy tham số trực tiếp:
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
Vì vậy, bạn thực sự sẽ phải chọn một trong những khuôn khổ đó.
import cgi
, phải không print form["username"].value
?
Bottle
mà tôi tin rằng sử dụng wsgi
, bất cứ ai cũng có thể đăng tương đương để sử dụng trong kịch bản đó? Câu trả lời trên là lời giải thích rõ ràng nhất mà tôi đã gặp, nó chỉ không bao gồm kịch bản của tôi.
Tôi biết đây là một câu hỏi cũ. Tuy nhiên, thật đáng ngạc nhiên khi không có câu trả lời tốt được đưa ra.
Trước hết câu hỏi là hoàn toàn hợp lệ mà không đề cập đến khuôn khổ. TIẾP THEO là một ngôn ngữ tương đương PHP. Mặc dù có nhiều cách để có được các tham số chuỗi truy vấn trong Python, các biến khung chỉ được đưa vào một cách thuận tiện. Trong PHP, $_GET
và $_POST
cũng là các biến tiện lợi. Chúng được phân tích cú pháp từ đầu vào QUERY_URI và php: //.
Trong Python, các hàm này sẽ là os.getenv('QUERY_STRING')
và sys.stdin.read()
. Hãy nhớ nhập các mô-đun os và sys.
Chúng ta phải cẩn thận với từ "CGI" ở đây, đặc biệt là khi nói về hai ngôn ngữ và điểm chung của chúng khi giao tiếp với máy chủ web. 1. CGI, như một giao thức, xác định cơ chế vận chuyển dữ liệu trong giao thức HTTP. 2. Python có thể được cấu hình để chạy dưới dạng tập lệnh CGI trong Apache. 3. Mô-đun CGI trong Python cung cấp một số chức năng tiện lợi.
Do giao thức HTTP không phụ thuộc vào ngôn ngữ và tiện ích mở rộng CGI của Apache cũng độc lập với ngôn ngữ, việc nhận các tham số GET và POST chỉ mang các khác biệt về cú pháp giữa các ngôn ngữ.
Đây là thói quen Python để điền từ điển 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
và cho 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
Bây giờ bạn có thể truy cập các trường như sau:
print GET.get('user_id')
print POST.get('user_name')
Tôi cũng phải chỉ ra rằng mô-đun CGI không hoạt động tốt. Xem xét yêu cầu HTTP này:
POST / test.py?user_id=6
user_name=Bob&age=30
Việc sử dụng CGI.FieldStorage().getvalue('user_id')
sẽ gây ra ngoại lệ con trỏ null vì mô-đun kiểm tra dữ liệu POST một cách mù quáng, bỏ qua thực tế là yêu cầu POST cũng có thể mang tham số GET.
AttributeError: 'NoneType' object has no attribute 'split'
sử dụng CGI
với Python
2.7
POST.get('user_name', 'default_value')
.
Tôi đã tìm thấy câu trả lời của nosklo rất rộng rãi và hữu ích! Đối với những người, giống như tôi, những người có thể thấy việc truy cập trực tiếp vào dữ liệu yêu cầu thô cũng hữu ích, tôi muốn thêm cách để làm điều đó:
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
. Các biến môi trường sau có liên quan: os.environ.get('PATH_INFO')
lấy tên phương thức (ví dụ: / ThisIsMyMethod) và os.environ.get('SCRIPT_NAME')
cung cấp đường dẫn đến tập lệnh từ thư mục gốc của máy chủ web (ví dụ: /cgi-bin/cgi.py). Trong trường hợp của tôi, QUERY_STRING trống, vì tôi đang sử dụng POST.
Chúng được lưu trữ trong đối tượng lưu trữ trường CGI.
import cgi
form = cgi.FieldStorage()
print "The user entered %s" % form.getvalue("uservalue")
Nó phần nào phụ thuộc vào những gì bạn sử dụng như một khung CGI, nhưng chúng có sẵn trong các từ điển có thể truy cập được vào chương trình. Tôi sẽ chỉ cho bạn các tài liệu, nhưng tôi không truy cập vào python.org ngay bây giờ. Nhưng lưu ý này trên mail.python.org sẽ cung cấp cho bạn một con trỏ đầu tiên . Nhìn vào libs CGI và URLLIB để biết thêm.
Cập nhật
Được rồi, liên kết đó bị vỡ. Đây là ref wsgi cơ bản
Python chỉ là một ngôn ngữ, để có được dữ liệu GET và POST, bạn cần có khung web hoặc bộ công cụ được viết bằng Python. Django là một, như Charlie chỉ ra, các mô-đun chuẩn cgi và urllib là những mô-đun khác. Cũng có sẵn là Turbogears, Pylons, CherryPy, web.py, mod_python, fastcgi, v.v.
Trong Django, các hàm xem của bạn nhận được một đối số yêu cầu có request.GET và request.POST. Các khuôn khổ khác sẽ làm điều đó khác nhau.