Как обрабатывать RuntimeWarning: сопрограмма new_account никогда не ожидалась

Всякий раз, когда я запускаю web.py и перехожу к localhost:8080/register, я получаю эту ошибку. Это часть флеш-игры.

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 регистрации бота:

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

person Emre Dogan    schedule 11.09.2020    source источник
comment
Как исправить эту ошибку?   -  person Emre Dogan    schedule 11.09.2020
comment
Не показывая нам свой код, это действительно сложно сказать, но вам, вероятно, нужно вставить туда await: uid, password = await untold.bot_common.new_account(app["redis"])   -  person dirn    schedule 11.09.2020
comment
Я добавил источник bot_common.py, вы можете это проверить?   -  person Emre Dogan    schedule 11.09.2020


Ответы (1)


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"
person dirn    schedule 11.09.2020