如何处理RuntimeWarning:从未等待协程'new_account'

问题描述

每当我启动 web.py 并转到localhost:8080/register时,都会出现此错误。 这是Flash游戏的一部分。

web.py:75: RuntimeWarning: coroutine 'new_account' was never awaited
  uid,password = utils.bot_common.new_account(app["redis"])
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
Error handling request
Traceback (most recent call last):
  File "/root/.local/lib/python3.7/site-packages/aiohttp/web_protocol.py",line418,in start
    resp = await task
  File "/root/.local/lib/python3.7/site-packages/aiohttp/web_app.py",line 458,in _handle
    resp = await handler(request)
  File "/root/.local/lib/python3.7/site-packages/aiohttp/web_middlewares.py",lne 119,in impl
    return await handler(request)
  File "/root/.local/lib/python3.7/site-packages/aiohttp_session/__init__.py",ine 154,in factory
    response = await handler(request)
  File "web.py",line 75,in register
    uid,password = utils.bot_common.new_account(app["redis"])
TypeError: cannot unpack non-iterable coroutine object

以上错误指向 web.py 第75行:

@routes.get("/register")
async def register(request):
    if not registation:
        return web.Response(text="Регистрация отключена")
    uid,password =  utils.bot_common.new_account(app["redis"])
    return web.Response(text=f"Аккаунт создан,ваш логин - {uid},"
                             f"пароль - {password}")

bot_commony.py 注册bot的更多信息:

import string
import random
def random_string(string_length=20):
    letters = string.ascii_letters
    return ''.join(random.choice(letters) for i in range(string_length))

async def new_account(redis):
    await redis.incr("uids")
    uid = await redis.get("uids")
    pipe = redis.pipeline()
    pipe.set(f"uid:{uid}:lvt",0)
    pipe.sadd(f"rooms:{uid}","livingroom")
    pipe.rpush(f"rooms:{uid}:livingroom","#livingRoom",1)
    for i in range(1,6):
        pipe.sadd(f"rooms:{uid}",f"room{i}")
        pipe.rpush(f"rooms:{uid}:room{i}",f"Комната {i}",2)
    await pipe.execute()
    return uid

解决方法

new_account返回一个协程,因此

TypeError: cannot unpack non-iterable coroutine object

协程需要等待(或包装在任务中)。要修复此特定的TypeError,您需要将代码更新为

uid,password = await untold.bot_common.new_account(app["redis"])

一旦您进行了此更改,我怀疑您会得到一个新的TypeError

TypeError: cannot unpack non-iterable int object

这是因为new_account返回一个值:uid。基于await redis.incr("uids"),您似乎拥有一个整数,而不是两个字符的字符串或包含两个值的容器。您要么需要将register中的行更改为

uid = await untold.bot_common.new_account(app["redis"])

或者您需要更改new_account以返回多个值

return uid,"some password"