2012-04-28 24 views
18

Tôi đang cố gắng sử dụng Tornado để khởi động máy chủ và đăng chuỗi ký tự lên đó. Tôi đã tìm thấy rất nhiều ví dụ về cách viết phương thức đăng bài trong lớp trình xử lý, nhưng không có ví dụ nào về cách viết yêu cầu bài đăng. Mã hiện tại của tôi không làm cho phương thức post thực thi, nhưng get_argument không nhận được dữ liệu - nó chỉ in mặc định "No data received" mỗi lần. Tôi đang làm gì sai?Làm thế nào để sử dụng phương pháp POST trong Tornado?

Mã của tôi trông như thế này:

class MainHandler(tornado.web.RequestHandler): 
    def post(self): 
     data = self.get_argument('body', 'No data received') 
     self.write(data) 

application = tornado.web.Application([ 
    (r"/", MainHandler), 
]) 

if __name__ == "__main__": 

    def handle_request(response): 
     if response.error: 
      print "Error:", response.error 
     else: 
      print response.body 
     tornado.ioloop.IOLoop.instance().stop() 

    application.listen(8888)  
    test = "test data" 
    http_client = tornado.httpclient.AsyncHTTPClient() 
    http_client.fetch("http://0.0.0.0:8888", handle_request, method='POST', headers=None, body=test) 
    tornado.ioloop.IOLoop.instance().start() 

Được đặt chuỗi Tôi muốn gửi trong "cơ thể" tham số điều phải làm gì? Trong một số ví dụ tôi đã nhìn thấy, giống như here, có vẻ như mọi người tạo ra các thông số riêng của họ, nhưng nếu tôi cố gắng thêm một tham số mới cho yêu cầu, như

http_client.fetch("http://0.0.0.0:8888", handle_request, method='POST', headers=None, data=test) 

tôi chỉ nhận được một lỗi nói "Lỗi Loại: init() có đối số từ khóa không mong muốn 'dữ liệu' "

Cảm ơn!

Trả lời

32

it seems people create their own parameters

Không hoàn toàn. Từ các tài liệu:

fetch(request, **kwargs)

Executes a request, returning an HTTPResponse.

The request may be either a string URL or an HTTPRequest object. If it is a string, we construct an HTTPRequest using any additional kwargs: HTTPRequest(request, **kwargs)

(Link)

Vì vậy, các kwargs thực sự từ this method.

Dù sao, với thịt thực sự của sự cố: Bạn gửi dữ liệu POST như thế nào? Bạn đã đi đúng hướng, nhưng bạn cần phải mã hóa url dữ liệu POST của bạn và sử dụng dữ liệu đó làm kwarg body của bạn. Như thế này:

import urllib 
post_data = { 'data': 'test data' } #A dictionary of your post data 
body = urllib.urlencode(post_data) #Make it into a post request 
http_client.fetch("http://0.0.0.0:8888", handle_request, method='POST', headers=None, body=body) #Send it off! 

Sau đó, để lấy dữ liệu:

data = self.get_argument('data', 'No data received') 
+0

chính xác những gì tôi cần, cảm ơn! – user1363445

Các vấn đề liên quan