写了一个获取邮箱验证码的视图函数,因为邮箱发送是阻塞操作,我准备使用协程来完成这个操作,但是我都写好了后却出现了这个报错是怎么回事?
报错如下
很奇怪的就是,协程报错之后邮件是以同步形式发送的,相当于报错了也能发送邮件验证码。用的是flask
以下为代码
async def task_email(email2,verify_code):
task_list = []
message = Message(subject='验证码',recipients=[email2],body=verify_code,sender=('秋零','work1145141919@outlook.com'))
task = asyncio.create_task(mail.send(message))
task_list.append(task)
await asyncio.gather(*task_list)
# 验证码模块获取视图函数
@bp.post('/get_verifycode')
def get_verifycode():
data = request.get_json()
email1 = decrypt_AES(data['email'])
email2 = remove_padding(email1)
email_data = registe_email(email=email2)
if email_data.validate():
verify_code = secrets.token_urlsafe(4)
# print(verify_code)
# message = Message(subject='验证码',recipients=[email2],body=verify_code,sender=('秋零','work1145141919@outlook.com'))
# mail.send(message)
# asyncio.run(task_email(email2,verify_code))
loop = asyncio.new_event_loop()
loop.run_until_complete(task_email(email2,verify_code))
code_task = verify_codetable(code=verify_code)
db.session.add(code_task)
db.session.commit()
return jsonify({'code': 200, 'message': '验证码发送成功', 'data': 'null'})
else:
return jsonify({'code': 200, 'message': f'{email_data.errors}', 'data': 'null'})
我写了个demo,利用
time.sleep()
模拟同步耗时函数,利用asyncio
的run_in_executor
包裹那些同步函数,然后实现异步执行。你参考一下:输出: