You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中后台运行Telegram Bot且保证服务正常启动?

在Django中后台运行Telegram Bot的解决方案

问题描述

尝试将Telegram Bot与Django结合,通过apps.py的ready方法启动Bot,但updater.idle()会进入无限循环,导致Django服务器无法正常启动。曾尝试django-background-tasks,但该工具与Django 4.0不兼容。

现有代码:

apps.py

from django.apps import AppConfig
import os

class BotConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'bot'
    
    def ready(self):
        from . import jobs

        if os.environ.get('RUN_MAIN', None) != 'true':
            jobs.StartBot()

jobs.py

def StartBot():
    
    updater = Updater("API KEY")
    dp = updater.dispatcher
    dp.add_handler(ChatMemberHandler(GetStatus, ChatMemberHandler.CHAT_MEMBER))
    updater.start_polling(allowed_updates=Update.ALL_TYPES)
    updater.idle()

可行解决方案

1. 使用线程隔离Bot运行(快速适配)

将Bot的启动逻辑放入独立线程,避免阻塞Django的启动流程。

修改apps.py,添加线程调用:

from django.apps import AppConfig
import os
import threading

class BotConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'bot'
    
    def ready(self):
        from . import jobs

        if os.environ.get('RUN_MAIN', None) != 'true':
            # 用守护线程启动Bot,不阻塞Django主进程
            threading.Thread(target=jobs.StartBot, daemon=True).start()

优缺点:实现简单,适合开发环境或小型项目;但Bot崩溃后无法自动重启,依赖Django进程存活。

2. 使用Celery异步任务框架(生产环境推荐)

Celery是Django生态中成熟的异步任务管理工具,支持后台长期任务的运行、监控与重启。

步骤:

  1. 安装Celery:
pip install celery
  1. 在项目根目录创建celery.py:
import os
from celery import Celery

# 替换为你的项目设置模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')

app = Celery('your_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
  1. 在项目__init__.py中添加:
from .celery import app as celery_app

__all__ = ('celery_app',)
  1. 在bot应用下创建tasks.py:
from celery import shared_task
from telegram.ext import Updater, ChatMemberHandler, Update
from .jobs import GetStatus

@shared_task
def start_telegram_bot():
    updater = Updater("API KEY")
    dp = updater.dispatcher
    dp.add_handler(ChatMemberHandler(GetStatus, ChatMemberHandler.CHAT_MEMBER))
    updater.start_polling(allowed_updates=Update.ALL_TYPES)
    updater.idle()
  1. 启动Celery Worker:
celery -A your_project worker --loglevel=info

注意:确保仅启动一次Bot任务,可通过管理命令或Celery配置控制任务执行次数。

3. 独立部署Bot与Django服务(解耦最优方案)

将Bot代码作为独立服务运行,与Django通过API或数据库交互,彻底解耦两者的生命周期。

步骤:

  1. 在bot应用下创建管理命令management/commands/startbot.py:
from django.core.management.base import BaseCommand
from bot.jobs import StartBot

class Command(BaseCommand):
    help = '启动Telegram Bot'

    def handle(self, *args, **options):
        StartBot()
  1. 单独启动Bot:
python manage.py startbot
  1. 使用systemd或supervisor等工具管理Bot进程,确保后台持续运行并自动重启。

优缺点:解耦性强,各自独立扩展与维护;生产环境最稳定,但需要额外的进程管理配置。


内容的提问来源于stack exchange,提问作者Vaibhav Vishwakarma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:06:32