telegram бот на Django не работает асинхронно (async_telebot)
делаю активатор аккаунта на сайте через тг бота
но сначала запускается бот, а потом джанго, и бот уже не отвечает. знаю что таким способом возможно сделать чтоб и джанго отвечал и бот
views.py
from .tg_bot import bot
def signup(request):
if request.method == "POST":
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
profile, created = Profile.objects.get_or_create(user=user)
name_bot = 'nametg_bot'
activation_url = f"https://t.me/{name_bot}?start={profile.telegram_activation_code}"
return render(request, template_name="confirm_tg.html", context={"activation_url": activation_url})
else:
form = UserCreationForm()
return render(request, template_name="signup.html", context={"form": form})
models.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile', null=True)
telegram_username = models.CharField(max_length=255, verbose_name="телеграм username", null=True, blank=True)
activation_code = models.CharField(max_length=32, default=uuid.uuid4, editable=False)
telegram_activation_code = models.CharField(max_length=16, default=uuid.uuid4, editable=False)
def __str__(self):
return f'{self.telegram_username}'
class Meta:
verbose_name = "Пользователь"
verbose_name_plural = "Пользователь"
@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
instance.profile.save()
tg_bot.py
from telebot.async_telebot import AsyncTeleBot
from .models import Profile
from django.conf import settings
import asyncio
bot = AsyncTeleBot(settings.API_TOKEN)
print("бот запущен")
@bot.message_handler(commands=['start'])
async def process_start_command(message):
activation_code = message.text.split(' ', 1)[1] if len(message.text.split(' ', 1)) > 1 else None
if activation_code:
profile = Profile.objects.filter(telegram_activation_code=activation_code).first()
if profile:
profile.user.is_active = True
profile.user.save()
profile.telegram_username = message.from_user.username
profile.save()
await bot.send_message(message.chat.id, "аккаунт активирован")
else:
await bot.send_message(message.chat.id, "неверная ссылка активации")
@bot.message_handler(commands=['ping'])
async def test_command(message):
await bot.send_message(message.chat.id, "pong")
asyncio.run(bot.polling())