Các biến POST và GET được xử lý trong Python như thế nào?


135

Trong PHP, bạn chỉ có thể sử dụng $_POSTcho các biến POST và $_GETcho các biến GET (Chuỗi truy vấn). Python tương đương là gì?


Bạn đang viết một kịch bản CGI, mod_python hoặc ứng dụng Django (hoặc khung khác)? Câu trả lời xoay quanh thông tin thêm một chút ...
Rob

bạn có thể cung cấp mã mẫu cho mỗi trong số này?
Nhấp vào Upvote

2
CGI, mod_python, Django, CherryPy và Pylons không phải là mẫu mã. Chúng là các khung Web Python xử lý GET và POST. Xem wiki.python.org/moin/WebFrameworks để biết thông tin. Câu hỏi của bạn - như đã hỏi - không thể được trả lời.
S.Lott

Câu trả lời:


246

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

Công cụ ứng dụng Google :

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ổ đó.


18
Sử dụng import cgi, phải không print form["username"].value?
J. Katzwinkel

Tôi đang sử dụng Bottlemà 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.
dùng1063287

2
FieldStorage bị hỏng trong python3, bạn có thể gặp sự cố với nó. bug.python.org/su6234
NuclePeon

2
Cho phép tôi làm rõ về nhận xét trước đây của tôi; trang này: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode giải thích rõ hơn về nó. Không sử dụng FieldStorage () trong python 3 vì vấn đề mã hóa.
NuclePeon

Đối với Flask, nó hơi khác một chút: request.args.get ('tên người dùng')
Damjan Pavlica

35

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$_POSTcũ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')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.


Tôi đã gặp lỗi này: AttributeError: 'NoneType' object has no attribute 'split'sử dụng CGIvới Python2.7
nến

1
Về lỗi @candlejack đã nói, hãy thử nhận các đối số như thế này POST.get('user_name', 'default_value').
George Siggouroglou

@GeorgeSiggouroglou Điều 'default_value' đã giải quyết vấn đề của tôi. Cảm ơn!
umbe1987

1
Chắc chắn câu trả lời yêu thích của tôi cho đến nay! +1
umbe1987

QUERY_STRING không phải là một chỉ mục hợp lệ trên Mac
Samuel Ev

31

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()

Tôi đang cố gắng gọi một phương thức trong một tập tin cgi. Một url ví dụ là 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.
NuclePeon

28

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")

2
-1. có khá nhiều đại diện của đối tượng yêu cầu, tùy thuộc vào libs / framework được sử dụng.
bruno Desthuilliers

10
Tôi không chắc tại sao bạn lại làm -1. Ý tôi là, những gì tôi đã cho công trình. Có lẽ anh ta không thể sử dụng một khuôn khổ. Ngoài ra, không phải hầu hết các khung chỉ sử dụng điều này trong nền?
Evan Fosmark

4
Thật ngu ngốc khi làm -1, tôi đã +1 để cân bằng nó, cộng với tôi nghĩ rằng đây là phương pháp tốt nhất vì nó trả về một sting (đó là những gì được yêu cầu)
joedborg

1
@Liam Không chắc tại sao bạn nhận được Không, nhưng bài đăng này đã hơn 6 tuổi, vì vậy tôi sẽ không nghi ngờ nếu mọi thứ đã thay đổi.
Evan Fosmark

@EvanFosmark Tôi không nhận được giá trị nào bằng cách sử dụng giá trị này. Khi tôi in giá trị được trả về từ cgi.FeildStorage, đây là kết quả đầu ra là FieldStorage (Không, Không, []). Tôi đã đăng một câu hỏi đầy đủ ở đây stackoverflow.com/questions/38024516/ mài Bất kỳ trợ giúp sẽ được đánh giá cao.
Chor Sipahi

1

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


Nếu bạn không đủ tham vọng để theo liên kết, tôi không đủ tham vọng để cắt và dán nếu từ liên kết.
Charlie Martin

1
và bây giờ liên kết đã chết và đó là lý do tại sao mọi người ghét câu trả lời như thế này và hạ thấp chúng. Xin chúc mừng.
John Tyree

2
Bạn biết đấy, mỗi khi tôi nhận được một bình luận từ một người nào đó chê bai rằng một câu trả lời năm - gần sáu tuổi bây giờ có một liên kết bị hỏng, không cần nói, thêm một liên kết thay thế, tôi có thể đặt cược đó là một người có đại diện <1000
Charlie Martin

Nếu tôi biết nơi nào cần liên kết thay thế (gợi ý, tôi đã không làm vì liên kết của bạn không hoạt động) Tôi sẽ không tìm kiếm câu hỏi này.
John Tyree

Bạn luôn có thể thử gợi ý về 'CGI và URLLIB python libs' tôi cho rằng.
Charlie Martin

0

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.


13
"Để 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" - Đơn giản là không đúng
James Tomasino

2
Tôi đồng ý với James, nếu chúng được viết bằng Python, rõ ràng chúng có thể được viết lại theo sở thích của bạn.
Robin Sandström

Ok tôi là một người mới đến trong python và tôi nghĩ rằng tôi không thể sử dụng một khung công tác. Câu hỏi của tôi là cách nào? Tôi không sử dụng bất kỳ khuôn khổ nào và tôi đã có apache2 phục vụ một kịch bản python. Sẽ thật tuyệt khi hiển thị một cách đơn giản chết người như việc sử dụng $ _GET hoặc $ _POST trong php.
Sensei đen

1
@JamesTomasino Trong bối cảnh của câu hỏi, đó là sự thật.
peterh - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.