วิธีใช้ coroutine ในเครื่องมือตกแต่งแบบกำหนดเองเมื่อทำงานกับการดำเนินการ db ในพายุทอร์นาโด

ฉันมีตัวจัดการที่จัดการคำขอด้วยวิธีรับและโพสต์ ฉันต้องการใช้การตรวจสอบสิทธิ์กับมัณฑนากรที่กำหนดเองของฉันเอง ไม่ใช่ทอร์นาโดเอง @tornado.web.มัณฑนากรที่ได้รับการรับรองความถูกต้อง ในมัณฑนากรแบบกำหนดเองของฉัน ฉันต้องสืบค้น db เพื่อระบุผู้ใช้ แต่การสืบค้น db ในพายุทอร์นาโดนั้นไม่พร้อมกันกับ @gen.coroutine

รหัสของฉันคือ:

handlers.py;

 @account.utils.authentication
    @gen.coroutine
    def get(self, page):

บัญชี/utils.py:

@tornado.gen.coroutine
def authentication(fun):
    def test(self,*args, **kwargs    ):
        print(self)
        db = self.application.settings['db']
        result = yield db.user.find()
        r = yield result.to_list(None)
        print(r)
    return test

แต่เกิดข้อผิดพลาดเมื่อเข้าถึง :

Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "/Users/moonmoonbird/Documents/kuolie/lib/python2.7/site-packages/tornado/web.py", บรรทัด 1443 ใน _execute result = method(*self.path_args, **self.path_kwargs) TypeError: ไม่สามารถเรียกวัตถุ 'อนาคต' ได้

ใครสามารถตอบสนองสิ่งนี้มาก่อนได้ วิธีที่ถูกต้องในการเขียนมัณฑนากรแบบกำหนดเองเพื่อตรวจสอบสิทธิ์กับการดำเนินการ async db คืออะไร ขอบคุณล่วงหน้า~


person Peng Kim    schedule 30.04.2016    source แหล่งที่มา


คำตอบ (1)


มัณฑนากรจะต้องซิงโครนัส มันคือ ฟังก์ชันที่ส่งคืน ที่เป็น coroutine คุณต้องเปลี่ยน:

@tornado.gen.coroutine
def authentication(fun):
    def test(self, *args, **kwargs):
        ...
    return test

To:

def authentication(fun):
    @tornado.gen.coroutine  # note
    def test(self, *args, **kwargs):
        ...
    return test
person jonrsharpe    schedule 30.04.2016