Задать вопрос
@ex_corpse

Как правильно регистрировать хендлеры для импорта?

Столкнулся с проблемой импорта
Вот сам код:

update_photo.py
from aiogram.dispatcher import FSMContext
from aiogram import types, Dispatcher
from aiogram.dispatcher.filters.state import StatesGroup, State
from aiogram.dispatcher.filters import Text


class ChangePhoto(StatesGroup):
    new_photo = State()

async def updating(message: types.Message):
    await message.answer("Пришлите новое фото")
    await ChangePhoto.new_photo.set()

async def bad_new_photo(message: types.Message):
    await message.reply(" Это не фотография")
    return

async def new_photo_updated(message: types.Message, state: FSMContext):
    await state.update_data(photo=message.photo[0].file_id)
    data = await state.get_data()
    await message.answer("Фото обновлено")
    return db.update_user_photo(data['photo'], message.from_user.id)

def register_new_photo(dp: Dispatcher):
    dp.register_message_handler(updating, Text(equals="Фотографию"))
    dp.register_message_handler(bad_new_photo, lambda photo: not photo.photo, state=ChangePhoto.new_photo)
    dp.register_message_handler(new_photo_updated, state=ChangePhoto.new_photo)


keyboard.py
from aiogram.types import ReplyKeyboardMarkup

kb = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
kb.add("Описание").add("Фотографию").add("Всю анкету")


main.py
from aiogram import types, Bot, Dispatcher
from aiogram.dispatcher.filters import Text
from aiogram.utils import executor
from src.states.update_photo import register_new_photo
from src.keyboards.kb_for_database import kb
import os


bot = Bot(token=os.getenv("TOKEN"))
dp = Dispatcher(bot=bot)

@dp.message_handler(Text(equals="Обновить анкету"))
async def update_users_form(message: types.Message):
    await message.answer("Что желаете обновить?", reply_markup=kb)

@dp.message_handler(Text(equals="Фотографию"))
async def update_user_picture(message: types.Message):
    register_new_photo(dp=dp)


if __name__ == '__main__':
    executor.start_polling(dp)


Если запускаю код отдельно в в файле update.py, то работает без проблем
  • Вопрос задан
  • 776 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
1. Не нашел в вашем тексте упоминаемого файла update.py
2. В файле main.py вы пытаетесь зарегистрировать хендлеры в хендлере
main.py
import logging


async def on_startup(dispatcher):
    logging.basicConfig(
        level=logging.DEBUG,
        format=u'%(filename)s:%(lineno)d #%(levelname)-8s [%(asctime)s] - %(name)s - %(message)s',
    )
    logger.info("Starting bot")

    # Импортируем функции регистрации хендлеров
    from update_photo import register_new_photo
    # Регистрируем хендлеры
    register_new_photo(dispatcher)


async def on_shutdown(dispatcher):
    logging.warning('Shutting down..')
    await dispatcher.storage.close()
    await dispatcher.storage.wait_closed()
    logging.warning('Bye!')


if __name__ == '__main__':
    from aiogram.utils import executor
    from loader import dp

    executor.start_polling(dp,
                           skip_updates=True,  # Если нужно пропускаем апдейты
                           on_startup=on_startup,
                           on_shutdown=on_shutdown)

loader.py

import os

from aiogram import Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage

bot = Bot(token=os.getenv("TOKEN"))
storage = MemoryStorage()
dp = Dispatcher(bot=bot, storage=storage)

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы