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

已安装APScheduler仍报ModuleNotFoundError,Django+Python3.11环境求助

问题排查与解决:ModuleNotFoundError: No module named 'apscheduler.schedulers'

问题根源

你的Django应用中存在一个名为apscheduler.py的文件,与第三方库APScheduler的包名完全冲突。Python导入模块时会优先搜索当前目录下的文件,导致代码尝试导入你自己编写的apscheduler.py,而非系统中安装的APScheduler库,因此出现找不到schedulers子模块的错误。

解决方案

1. 重命名冲突文件

将你自己编写的apscheduler.py文件重命名为不与第三方库重名的名称,例如apscheduler_tasks.py。

2. 修正导入路径与代码逻辑

原代码存在两个额外问题:一是apps.py中尝试导入不存在的start函数,二是直接在模块级别启动调度器可能导致Django启动时重复初始化。以下是修正后的代码:

修正后的apscheduler_tasks.py

from apscheduler.schedulers.background import BackgroundScheduler
from datetime import datetime, timedelta
import pytz
import requests
from .models import Todo

def notify_todo():
    # 获取当前东京时区时间
    now = datetime.now(pytz.timezone('Asia/Tokyo'))
    # 计算24小时后的日期(适配DateField类型)
    end_date = now + timedelta(days=1)
    
    # 筛选截止日期在未来24小时内的任务
    todos = Todo.objects.filter(deadline__range=(now.date(), end_date.date()))

    for todo in todos:
        api_token = 'xxxxxxxxxxxxxxxxxxxx'
        # 合并日期与时间字段,生成完整截止时间
        deadline_full = datetime.combine(todo.deadline, todo.ttime)
        message =  f"【{todo.title}】\n截止时间:{deadline_full.strftime('%Y/%m/%d %H:%M')}\n详情:{todo.description}"

        # 发送LINE Notify通知
        headers = {'Authorization': f'Bearer {api_token}'}
        payload = {'message': message}
        requests.post('https://notify-api.line.me/api/notify', headers=headers, data=payload)

# 初始化调度器
scheduler = BackgroundScheduler(timezone='Asia/Tokyo')

def start():
    # 避免重复添加任务(适配Django ready方法可能多次执行的场景)
    if not scheduler.get_job('todo_notify_job'):
        scheduler.add_job(notify_todo, 'interval', minutes=10, id='todo_notify_job')
        scheduler.start()

修正后的apps.py

from django.apps import AppConfig


class TodoConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'todo'

    def ready(self):
        from .apscheduler_tasks import start
        start()

3. 额外注意事项

  • 确认APScheduler已正确安装:执行pip install apscheduler或pip show apscheduler验证安装状态。
  • 原代码中deadline为DateField类型,直接与datetime对象做范围过滤会有类型不匹配问题,已修正为基于日期的筛选逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:43:31