Tôi mới làm quen với cơn lốc xoáy nên tôi đã làm theo hướng dẫn của cơn lốc xoáy. Khi tôi bắt đầu sử dụng Coroutines, ví dụ cho biết: Nhập và tạo từ Tornado.
@gen.coroutine
def tìm nạp_coroutine(url):
http_client = AsyncHTTPClient()
phản hồi = năng suất http_client.fetch(url)
# Trong các phiên bản Python trước 3.3, trả về giá trị từ
# máy phát điện không được phép sử dụng và bạn phải sử dụng
# nâng cao gen.Return(response.body)
# thay vì.
trả lại phản hồi.body
Khi tôi chạy thử nghiệm này, nó báo lỗi Cú pháp 'trở lại' với đối số bên trong trình tạo, vì vậy tôi đã bỏ ghi chú những gợi ý như sau: import Tornado.httpserver import Tornado .ioloop import Tornado.options import Tornado.web
từ nhập khẩu cơn lốc xoáy.options xác định, tùy chọn
Định nghĩa("port", default=8888, help="chạy trên cổng đã cho", type=int)
từ gen nhập khẩu cơn lốc xoáy
từ cơn lốc xoáy.httpclient nhập AsyncHTTPClient
@gen.coroutine
def tìm nạp_coroutine(url):
http_client = AsyncHTTPClient()
phản hồi = năng suất http_client.fetch(url)
#trả lại phản hồi.body
nâng cao gen.Return(response.body)
lớp MainHandler(tornado.web.RequestHandler):
chắc chắn nhận được (tự):
self.write("Xin chào thế giới")
dữ liệu = tìm nạp_coroutine (url = "http://www.baidu.com")
self.write(dữ liệu)
in dữ liệu
chắc chắn chính():
cơn lốc xoáy.options.parse_command_line()
ứng dụng = cơn lốc xoáy.web.Application([
(r"/", MainHandler),
])
http_server = cơn lốc xoáy.httpserver.HTTPServer(ứng dụng)
http_server.listen(options.port)
cơn lốc xoáy.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
chủ yếu()
Nhưng nó ném ngoại lệ như thế này:
[E 140925 17:35:53 web:1407] Ngoại lệ chưa được phát hiện GET / (::1)
HTTPServerRequest(protocol='http', Host='localhost:8888', Method='GET', uri='/', version='HTTP/1.1', remote_ip='::1', headers={'Accept- Ngôn ngữ': 'zh-TW,zh;q=0.8,zh-CN;q=0.6,en;q=0.4', 'Chấp nhận-Mã hóa': 'gzip,deflate,sdch', 'Máy chủ': 'localhost:8888', 'Chấp nhận': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q =0,8', 'Tác nhân người dùng': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'If-None-Match' : '"e02aa1b106d5c7c6a98def2b13005d5b84fd8dc8"'})
Traceback (most recent call last):
Tệp "/Library/Python/2.7/site-packages/tornado-4.0.2-py2.7-macosx-10.9-intel.egg/tornado/web.py", dòng 1332, trong _execute
kết quả = phương thức(*self.path_args, **self.path_kwargs)
Tệp "helloworld.py", dòng 39, trong get
self.write(dữ liệu)
Tệp "/Library/Python/2.7/site-packages/tornado-4.0.2-py2.7-macosx-10.9-intel.egg/tornado/web.py", dòng 656, bằng văn bản
raise TypeError("write() chỉ chấp nhận các đối tượng byte, unicode và dict")
TypeError: write() chỉ chấp nhận các đối tượng byte, unicode và dict
[E 140925 17:35:53 web:1811] 500 GET / (::1) 3,94ms
Tài liệu rấtví dụ tương tự :
lớp GenAsyncHandler(RequestHandler):
@gen.coroutine
chắc chắn nhận được (tự):
http_client = AsyncHTTPClient()
phản hồi = năng suất http_client.fetch("http://example.com")
do_something_with_response(phản hồi)
self.render("template.html")
总结:
- Trong python 2.x bạn không thể trả lại những thứ bên trong một khối, hãy sử dụng
@gen.coroutine
Trang trí, chỉ cho phép duy nhất trở lại
- Trong python 2.x, nếu bạn cần trả về thứ gì đó trong khối @gen.coroutine, thì hãy sử dụng
nuôi gen.Trở về
, như bạn đã hiểu chính xác
- Bạn không cần phải ở trong
lấy
Phương thức này trả về mọi thứ để phản hồi kèm theo một số dữ liệu cho máy khách. bạn cần nóviết
Một cái gì đó (trong ví dụ trên, đó là bằng cách gọi tự kết xuất
hoàn thành).
Vì vậy, thay thế mã này bằng
do_something_with_response(phản hồi)
self.render("template.html")
Sử dụng cái này:
self.write(response.body)
tự.finish()
tự.finish()
Phản hồi sẽ được hoàn thành, kết thúc yêu cầu HTTP. nó ở trong tự kết xuất
Tự động được gọi trong phương thức.
xử lý yêu cầu cuối cùng:
từ gen nhập khẩu cơn lốc xoáy
từ cơn lốc xoáy.web nhập requestHandler
từ cơn lốc xoáy.httpclient nhập AsyncHTTPClient
lớp GenAsyncHandler(RequestHandler):
@gen.coroutine
chắc chắn nhận được (tự):
http_client = AsyncHTTPClient()
phản hồi = năng suất http_client.fetch("http://google.com")
self.write(response.body)
tự.finish()
Tôi là một lập trình viên xuất sắc, rất giỏi!