Почему не переходит в обработку состояния Form.title
Вот мой код я пытался обработать как-то но ничего дельного не выходит.
from aiogram import Bot, Dispatcher, types, Router
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.filters import Command
from aiohttp import ClientSession
import logging
from aiogram.dispatcher import router
import asyncio
from setting import API_TOKEN
access_token = "" # Токен полученный от сайта
# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(storage=storage)
main_router = Router()
manage_router = Router()
router = Router()
#Получение данных от пользователя:
#state
class Form(StatesGroup):
username = State()
password = State()
id = State()
title = State()
description = State()
@manage_router.message(Command("update"))
async def update_start(msg:types.Message,state:FSMContext):
await msg.answer("Введи задачу которую хотите обновить")
await state.set_state(Form.id)
@manage_router.message(Form.id)
async def verification_task(msg:types.Message,state:FSMContext):
await state.update_data(id=msg.text)
global access_token
if access_token == "":
await msg.reply("Вы не авторизованы. Авторизуйтесь /login")
return
headers = {
"Authorization": f"Token {access_token}",
}
data_task = await state.get_data()
id_task = data_task.get("id")
url = f"http://127.0.0.1:8000/api/v1/task/{id_task}/"
async with ClientSession() as session:
async with session.get(url, headers=headers) as response:
if response.status == 200:
await msg.answer("Введите новое название вашей задачи")
await state.set_state(Form.title)
print(f"Текущее состояние: {await state.get_state()}")
await msg.answer(f"Что-то пошло не так 1. Ошибка {response.status}")
@manage_router.message(Form.title)
async def update_title(msg: types.Message,state:FSMContext):
print(f"Текущее состояние: {await state.get_state()}")
await state.update_data(title=msg.text)
await msg.answer("Введите новое описание задачи")
await state.set_state(Form.description)```
@manage_router.message(Form.description)
async def update_description(msg: types.Message,state:FSMContext):
await state.update_data(title=msg.text)
await update_end(msg,state)
async def update_end(msg:types.Message,state:FSMContext):
global access_token
if access_token == "":
await msg.reply("Вы не авторизованы. Авторизуйтесь /login")
return
headers = {
"Authorization": f"Token {access_token}",
}
data_task = await state.get_data()
id_task = data_task.get("id")
title_task = data_task.get("title")
description_task = data_task.get("description")
data = {
"title": f'{title_task}',
"description": f'{description_task}',
}
url = f"http://127.0.0.1:8000/api/v1/task/{id_task}/"
async with ClientSession() as session:
async with session.put(url,headers=headers,data=data) as response:
if response.status == 200:
await msg.answer("Успешно переходим дальше")
return
await msg.answer(f"Что-то пошло не так 2. Ошибка {response.status}")
await state.clear()
#Авторизация
@router.message(Command("login"))
async def login(msg: types.Message, state: FSMContext):
# Сохраняем логин в состоянии
await state.set_state(Form.username)
await msg.answer("Введите имя пользователя")
@router.message(Form.username)
async def process_login(msg:types.Message,state:FSMContext):
await state.update_data(username=msg.text)
await state.set_state(Form.password)
await msg.answer("Введите ваш пароль")
@router.message(Form.password)
async def process_password(msg: types.Message, state: FSMContext):
await state.update_data(password=msg.text)
user_data = await state.get_data()
login = user_data.get('username')
password = user_data.get('password')
data = {'username': login, 'password': password}
url = f"http://127.0.0.1:8000/auth/token/login"
async with ClientSession() as session:
async with session.post(url, data=data) as response:
if response.status == 200:
token = await response.json()
global access_token
access_token = token.get("auth_token")
await msg.answer(
"Вы успешно авторизовались! Теперь вы можете получить список задач командой /get_tasks.")
else:
await msg.answer("Неверный логин или пароль.\nПопробуйте заново /login")
await state.clear()
dp.include_router(router)
dp.include_router(manage_router)
dp.include_router(main_router)
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Ответы (1 шт):
Автор решения: Алексей
→ Ссылка
Как я понял нельзя вызывать так состояние
async with ClientSession() as session:
async with session.get(url, headers=headers) as response:
if response.status == 200:
await msg.answer("Введите новое название вашей задачи")
await state.set_state(Form.title)
print(f"Текущее состояние: {await state.get_state()}")
await msg.answer(f"Что-то пошло не так 1. Ошибка {response.status}")
А нужно переходить вот-так:
async with ClientSession() as session:
async with session.get(url, headers=headers) as response:
if response.status == 200:
await msg.answer("Введите новое название вашей задачи")
else:
await msg.answer(f"Что-то пошло не так 1. Ошибка {response.status}")
return
await state.set_state(Form.title)