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

Django单文件运行报ImproperlyConfigured错误,求测试解决方案

解决Django单独运行文件时的ImproperlyConfigured错误

问题场景

运行testapscheduler.py时触发以下错误:

django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

本质原因是单独运行Django项目内的文件时,未初始化Django配置环境,导致无法调用ORM等核心功能。

解决方法

方法1:在代码中初始化Django环境

直接修改testapscheduler.py,在所有导入语句前添加Django初始化代码,指定项目配置模块路径:

import os
import django

# 替换为你的项目settings模块路径,比如项目根目录下的myproject/settings.py就写'myproject.settings'
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todo_project.settings')
django.setup()

同时修正models的导入路径,使用绝对导入避免模块找不到:
把from models import Todo改为from todo.models import Todo

修改后的完整代码:

import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todo_project.settings')
django.setup()

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


def notify_todo():
    now = datetime.now(pytz.timezone('Asia/Tokyo'))

    todos = Todo.objects.filter(
        deadline__gt=now - timedelta(minutes=30),
        deadline__lt=now + timedelta(minutes=30),
        ttime__isnull=False,
        ttime__gt=now.time()
    )

    logger = logging.getLogger('mylog')
    logger.setLevel(logging.DEBUG)
    sh = logging.StreamHandler()
    logger.addHandler(sh)
    logger.debug(f'{len(todos)}个TODO列表的截止时间在30分钟以内。')

    for todo in todos:
        api_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
        message = f"【{todo.title}】\n截止时间:{todo.deadline.strftime('%Y/%m/%d %H:%M')}\n详情:{todo.description}"
        headers = {'Authorization': f'Bearer {api_token}'}
        payload = {'message': message}
        requests.post('https://notify-api.line.me/api/notify', headers=headers, data=payload)

def start():
    scheduler = BackgroundScheduler(timezone='Asia/Tokyo')
    scheduler.add_job(notify_todo, 'interval', seconds=2)
    scheduler.start()

# 保持程序运行,防止调度器启动后立即退出
if __name__ == '__main__':
    start()
    import time
    while True:
        time.sleep(1)

方法2:用Django Shell运行(测试推荐)

如果只是临时测试功能,无需修改代码,直接通过Django自带的shell运行:

  1. 进入项目根目录(包含manage.py的目录)
  2. 执行命令:
python manage.py shell
  1. 在shell中导入并启动调度器:
from todo.testapscheduler import start
start()

注意事项

  • 必须确保DJANGO_SETTINGS_MODULE的路径正确,对应你项目中settings.py的位置。
  • 单独运行调度器时,需要添加循环保持程序存活,否则调度器会在启动后立刻终止。

内容的提问来源于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 09:43:31