我有一个自定义的经过身份验证的装饰器,并在每个 get 和 post 方法上添加进行身份验证,在经过身份验证后,进行一些数据库查询和更新,但是当我使用电机产生更新()时,在完成()错误后抛出无法写入
帐户/utils.py:
def authentication(fun):
"""
decorator for authenticating whether a user is logged in or not
:param fun:
:return:
"""
@tornado.gen.coroutine
def wrapper(self, *args, **kwargs):
db = self.application.settings['db']
if kwargs['token'] != None:
session = yield db.session.find_one({'token': kwargs['token']},{'uid'})
if session != None:
kwargs['uid'] = session['uid']
raise gen.Return(fun(self, *args, **kwargs))
else:
self.write({'status':0,'message':'请登录',"data":{}})
else:
self.write({'status':0, 'message':'请登录', 'data':{}})
return wrapper
wall.handlers.py:
@account.utils.authentication
@gen.coroutine
def post(self, *args, **kwargs):
"""
post a new kuolie card
:param args:
:param kwargs:
:return:
"""
print('sss')
db = self.settings['db']
up = upyun.UpYun('kuolie-img', username='jinpeng', password='jinpengjinpeng')
uid = kwargs['uid']
request_data = json.loads(self.request.body)
user_docs = dict(
)
if 'nickname' in request_data.keys():
user_docs['nickname'] = request_data['nickname']
if 'qq' in request_data.keys():
user_docs['qq'] = request_data['qq']
if 'phone' in request_data.keys():
user_docs['phone'] = request_data['phone']
if 'weibo' in request_data.keys():
user_docs['weibo'] = request_data['weibo']
if 'weixin' in request_data.keys():
user_docs['weixin'] = request_data['weixin']
if 'level' in request_data.keys():
user_docs['level'] = request_data['level']
if 'meta' in request_data.keys():
user_docs['meta'] = request_data['meta']
if 'avatar' in request_data.keys():
user_docs['avatar'] = request_data['avatar']
if 'gender' in request_data.keys():
user_docs['gender'] = request_data['gender']
if 'kuolietext' in request_data.keys():
user_docs['kuolietext'] = request_data['kuolietext']
if 'kuolieimage' in request_data.keys():
user_docs['kuolieimage'] = request_data['kuolieimage']
if 'kuolieaudio' in request_data.keys():
user_docs['kuolieaudio'] = request_data['kuolieaudio']
user_docs['time'] = int(time.time())
result = yield db.user.update({'uid': uid}, {'$set': user_docs })
print result
if result['updatedExisting'] == True:
print('true')
self.write({'status':1,'message':'添加成功','data':{}})
当 post 请求到达时,装饰器对用户进行了身份验证,如果通过了身份验证,则进行更新,但出现错误:
[E 160503 17:16:00 concurrent:124] 从未检索到未来异常:回溯(最近一次调用最后一次):文件“/Users/moonmoonbird/Documents/kuolie/lib/python2.7/site-packages/tornado/gen .py”,第 1017 行,在运行中 yielded = self.gen.send(value) 文件“/Users/moonmoonbird/Documents/kuolie/kuolie/wall/handlers.py”,第 65 行,在 get self.write({' status':1,'message':'认证通过',"data":{"a":'b'}}) 文件“/Users/moonmoonbird/Documents/kuolie/lib/python2.7/site-packages/ tornado/web.py",第 685 行,写入引发 RuntimeError("Cannot write() after finish()") RuntimeError: Cannot write() after finish()
我做错了吗,有人可以帮助我吗,在此先感谢。