Maison > Questions et réponses > le corps du texte
最近在使用 Tornado,用到 gen.coroutine 和 yield 配合,但是出了些问题,一直不明白!
代码:
class BaseHandler(tornado.web.RequestHandler):
@gen.coroutine
def args_kwargs(self,pro):
try:
kwargs = self.get_argument("data",None)
if kwargs:
code="-10000"
raise gen.Return(code)
except:
print traceback.format_exc()
class EventAPIHandler(BaseHandler):
@gen.coroutine
def post(self):
try:
code = yield self.args_kwargs("event")
if code:
self.write(re_code[code])
self.finish()
except Exception,e:
print traceback.format_exc()
错误为:
Traceback (most recent call last):
File "server.py", line 124, in args_kwargs
raise gen.Return(code)
Return
不能返回数据,请问有大神知道原因吗?请指教,非常感谢!
伊谢尔伦2017-04-17 17:32:03
Original, veuillez supprimer le try sauf, attraper le try sauf lorsqu'il voit une relance, remplacez-le par ce qui suit, cela devrait fonctionner
class BaseHandler(tornado.web.RequestHandler):
@gen.coroutine
def args_kwargs(self,pro):
kwargs = self.get_argument("data", None)
if kwargs:
code = "-10000"
raise gen.Return(code)
else:
raise gen.Return("xxx")
class EventAPIHandler(BaseHandler):
@gen.coroutine
def post(self):
try:
code = yield self.args_kwargs("event")
if code:
self.write(re_code[code])
self.finish()
except Exception,e:
err = traceback.format_exc()
self.write(err)
self.finish()
阿神2017-04-17 17:32:03
Dans Python2.x, le générateur ne peut pas directement return 值
, donc Tornado enveloppe la valeur dans une exception spéciale et la renvoie Cette exception est gen.Return
, donc votre essai..e. xcept interceptera cette exception et signalera une erreur, alors changez le code de BaseHandler.args_kwargs
, veuillez vous référer à :
BTW Il semble qu'il n'y ait pas de rendement dans args_kwargs
, il semble que ce soit juste un paramètre là. il n'est pas nécessaire d'utiliser gen.coroutine
, n'est-ce pas ?
class BaseHandler(tornado.web.RequestHandler):
@gen.coroutine
def args_kwargs(self,pro):
try:
kwargs = self.get_argument("data",None)
except Exception as e:
print e
else:
code = "-10000" if kwargs else "0000000"
raise gen.Return(code)
class EventAPIHandler(BaseHandler):
@gen.coroutine
def post(self):
try:
code = yield self.args_kwargs("event")
if code:
self.write(re_code[code])
self.finish() # gen.coroutine会自动finish(),如果只是想结束连接,可把这一行替换为 return
except Exception,e:
print traceback.format_exc()