3

Corduroyを使用して、python Tornado Web Serverを使用して非同期に CouchDB と通信しようとしています。

以下のコードは、いくつかの変更を加えたコーデュロイ ガイドからのものです。

import tornado.web
from corduroy import Database, NotFound, relax

people_db = Database('people')

class RelaxedHello(tornado.web.RequestHandler):
    @relax
    def get(self, user_id):
        try:
            doc = yield people_db.get(user_id)
            self.write('hello %s'%(doc['name']))
        except NotFound:
            self.write('hello whoever you are')
        self.finish()

application = tornado.web.Application([
    (r'/hi/([^/]+)', RelaxedHello),
]).listen(1920)
tornado.ioloop.IOLoop.instance().start()

私が抱えている問題は、ソファのドキュメントを完全に見つけたにもかかわらず、BadYieldError を受け取ることです。tornado.gen モジュールが適切にセットアップされていない (または何か?) ことに関係していると思われます。@relax デコレータなしでコーデュロイを使用し、コールバックを使用すると正常に動作します。

Traceback (most recent call last):
  File "c:\env\pymeals_tornado\lib\site-packages\tornado\web.py", line 1074, in wrapper
    return method(self, *args, **kwargs)
  File "c:\env\pymeals_tornado\lib\site-packages\corduroy\__init__.py", line 43,  in _r_e_l_a_x_
    return gen.engine(_func_)(*args, **kwargs)
  File "c:\env\pymeals_tornado\lib\site-packages\tornado\gen.py", line 107, in wrapper
    runner.run()
  File "c:\env\pymeals_tornado\lib\site-packages\tornado\gen.py", line 319, in run
    yielded = self.gen.throw(*exc_info)
  File "test.py", line 10, in get
    doc = yield people_db.get(user_id)
BadYieldError: yielded unknown object <Document 65d936ee54417e46479a908f7a0038ef[2] {name:Colin}>
4

1 に答える 1

0

Relaxとget()のコードを読むと、コーデュロイの 3 年前のコードは、最新の Tornado イディオム用に設計されていないように見えます。具体的には、最新の Tornado APIのように を返すのではなく、コールバックを受け取ります。getFuture

つまり、次のgen.Taskような古いスタイルを使用する必要があります。

from tornado import gen

class RelaxedHello(tornado.web.RequestHandler):
    @relax
    def get(self, user_id):
        try:
            doc = yield gen.Task(people_db.get, user_id)
            self.write('hello %s'%(doc['name']))
        except NotFound:
            self.write('hello whoever you are')
        self.finish()

私はこれをテストしていないので、どうなるか教えてください。詳細についてgen.Taskは、Tornado のドキュメントを参照してください。

于 2015-08-07T22:41:10.097 に答える