RethinkDB
とTornado
を非同期で使用しています。 RethinkDB
のデータモデルをベースに、topic
テーブルのレコードを挿入すると、新しいレコードをuser_to_topic
テーブルに更新/挿入する必要があります。ここに私のポストリクエストハンドラの基本的なセットアップがあります。挿入操作が終了した後tornado.ioloop.IOLoopインスタンスadd_futureメソッドから値を返す方法
class TopicHandler(tornado.web.RequestHandler):
def get(self):
pass
@gen.coroutine
def post(self, *args, **kwargs):
# to establish databse connection
connection = rth.connect(host='localhost', port=00000, db=DATABASE_NAME)
# Thread the connection
threaded_conn = yield connection
title = self.get_body_argument('topic_title')
# insert into table
new_topic_record = rth.table('Topic').insert({
'title': topic_title,
}, conflict="error",
durability="hard").run(threaded_conn)
# {TODO} for now assume the result is always written successfully
io_loop = ioloop.IOLoop.instance()
# I want to return my generated_keys here
io_loop.add_future(new_topic_record, self.return_written_record_id)
# do stuff with the generated_keys here, how do I get those keys
def return_written_record_id(self, f):
_result = f.result()
return _result['generated_keys']
、私は結果のgenerated_keys
属性を使用して、新しいレコードのIDを取得することができFuture.result()
法によるRethinkDB
挿入操作からの戻り結果にFuture
オブジェクト。 Tornado
documentによると、私はコールバック関数return_written_record_id
の結果を持つことができます。もちろん、return_written_record_id
関数内の他のすべてのデータベース操作を行うことはできますが、すべてのIDを関数post
に返すことは可能ですか?それとも、トルネードでコルーチンを使用しなければならないのですか?
ご意見をお寄せください。ありがとうございました!