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

PythonAnywhere上Django定时任务无报错但无输出问题排查

问题核心原因

你现在遇到的所有问题都来自两个核心错误:

  1. 定时任务执行命令写法完全错误,既没有正确调用Django自定义管理命令,也没有配置正确的工作路径,导致要么模块导入失败,要么代码根本没有实际执行业务逻辑
  2. 自定义Command代码存在严重缩进错误,handle方法没有被归入Command类下,同时业务逻辑里的邮件发送缩进错误,会导致重复发信

分步修复方案

1. 修正Django管理命令的代码缩进与逻辑错误

你的代码里handle方法和Command类是同级的,Django根本识别不到要执行的任务逻辑,这也是之前任务返回0但无任何输出、无实际动作的核心原因。另外邮件发送逻辑缩进错误,会给Sport Science类型的预订重复发送两封不同模板的邮件,修正后的完整代码如下:

from django.core.management.base import BaseCommand
from advancement.models import Bookings
import datetime
import sys
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail
from decouple import config


class Command(BaseCommand):
    help = 'Sends Program Survey'

    def handle(self, *args, **kwargs):
        # Get today's date
        date_today = datetime.datetime.now().date()
        print(f"Start executing task, today is {date_today}")

        # Get booking data
        bookings = Bookings.objects.all()
        print(f"Found {bookings.count()} booking records")

        # For each booking today, send survey email
        for booking in bookings:
            if booking.booking_date == date_today:
                email = booking.email
                if booking.program_type == "Sport Science":
                    booking_template_id = 'd-bbc79704a31a4a62a5bfea90f6342b7a'
                else:
                    booking_template_id = 'd-3167927b3e2146519ff6d9035ab59256'
                
                booking_message = Mail(
                    from_email=config('FROM_EMAIL'),
                    to_emails=[email],
                )
                booking_message.template_id = booking_template_id
                try:
                    sg = SendGridAPIClient(config('SG_API'))
                    response = sg.send(booking_message)
                    print(f"Send mail to {email} success, status code: {response.status_code}")
                except Exception as e:
                    print(f"Send mail to {email} failed: {str(e)}", file=sys.stderr)
            else:
                print(f"Booking {booking.id} date is not today, skip")

代码里加了明确的节点打印日志方便后续排查,删除了冗余的重复导入

2. 修正PythonAnywhere定时任务执行命令

你之前用manage.py shell < 脚本路径的写法是错误的,Django自定义管理命令不需要通过shell重定向执行,直接调用命令名即可。之前出现ModuleNotFoundError: No module named 'advancement'的原因是执行命令时没有切换到项目根目录,Python找不到对应app模块。
正确的定时任务命令如下:

cd /home/vicinstofsport/advancement_series && workon advancementvenv && python -u manage.py scheduled_task

命令说明:

  • 先cd到manage.py所在的项目根目录,解决模块导入路径问题
  • 激活对应虚拟环境
  • 加-u参数禁用Python输出缓冲,保证print的内容可以实时写入定时任务日志,不会因为缓冲导致日志空白
  • 直接调用你本地可以正常运行的scheduled_task管理命令

3. 验证配置

配置定时任务前,先打开PythonAnywhere的Bash终端,执行上面的命令,确认:

  • 没有模块导入报错
  • 控制台可以正常输出你加的打印日志
  • 邮件可以正常发送
    确认没问题后再把命令填入定时任务配置即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:15:40