PythonAnywhere上Django定时任务无报错但无输出问题排查
问题核心原因
你现在遇到的所有问题都来自两个核心错误:
- 定时任务执行命令写法完全错误,既没有正确调用Django自定义管理命令,也没有配置正确的工作路径,导致要么模块导入失败,要么代码根本没有实际执行业务逻辑
- 自定义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
相关产品推荐
相关产品推荐

