Django 本身並沒有內建的定時任務系統,但你可以使用 Django 的管理命令結合系統的 cron 來實現定時檢查。這是一個簡單且有效的方法,特別適合中小型專案。以下是實現步驟:
- 建立自定義管理命令
在你的 Django 應用目錄下建立一個 management/commands
目錄結構,然後在其中建立一個 Python 檔案,比如 check_product_expiry.py
:
your_app/
management/
__init__.py
commands/
__init__.py
check_product_expiry.py
- 實現管理命令
在 check_product_expiry.py
檔案中編寫以下程式碼:
from django.core.management.base import BaseCommand
from django.utils import timezone
from your_app.models import ProductList, WhiteIpList
class Command(BaseCommand):
help = 'Check and update expired products and their white lists'
def handle(self, *args, **kwargs):
now = timezone.now()
# 檢查並更新過期產品
expired_products = ProductList.objects.filter(is_active=True, end_time__lt=now)
expired_count = expired_products.update(is_active=False)
# 更新相關的白名單
for product in expired_products:
WhiteIpList.objects.filter(token=product).update(is_active=False)
self.stdout.write(self.style.SUCCESS(f'Successfully updated {expired_count} expired products and their white lists'))
- 測試管理命令
你可以透過以下命令手動執行這個檢查:
python manage.py check_product_expiry
- 設定 cron 任務
接下來,你需要設定一個 cron 任務來定期執行這個命令。在 Linux 系統上,你可以使用 crontab -e
命令來編輯 cron 任務列表。
新增類似下面的行:
0 * * * * /path/to/your/python /path/to/your/manage.py check_product_expiry >> /path/to/logfile.log 2>&1
這會每小時執行一次你的命令。確保替換路徑為你的實際路徑。
- 日誌記錄(可選)
為了更好地跟蹤任務執行情況,你可以在 Django 設定中配置日誌:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': '/path/to/your/django_cron.log',
},
},
'loggers': {
'django.management.commands': {
'handlers': ['file'],
'level': 'INFO',
'propagate': True,
},
},
}
然後在你的管理命令中使用日誌:
import logging
logger = logging.getLogger(__name__)
class Command(BaseCommand):
def handle(self, *args, **kwargs):
# ... 其他程式碼 ...
logger.info(f'Updated {expired_count} expired products and their white lists')
優點:
- 簡單易實現,不需要額外的依賴。
- 利用系統的 cron,可靠且易於管理。
- 可以方便地與其他系統任務整合。
注意事項:
- 確保執行 Django 專案的使用者有許可權設定 cron 任務。
- 在生產環境中,可能需要考慮使用 supervisor 或類似工具來管理這個程序。
- 對於更復雜的任務排程需求,你可能需要考慮使用 Celery 這樣的任務佇列系統。
這種方法適合大多數中小型 Django 專案,能夠有效地實現定期檢查和更新產品狀態的需求。
在 Ubuntu 系統上,你可以使用 cron 來定期執行這個 Django 管理命令。以下是設定步驟:
-
開啟終端
-
編輯 crontab 檔案:
crontab -e
如果是第一次執行,系統可能會讓你選擇一個編輯器(如 nano)。
-
在開啟的檔案中新增一個新的 cron 任務。例如,要每小時執行一次,可以新增以下行:
0 * * * * /path/to/your/python /path/to/your/manage.py check_product_expiry >> /path/to/logfile.log 2>&1
解釋:
0 * * * *
表示每小時的第 0 分鐘執行/path/to/your/python
是你的 Python 直譯器的路徑/path/to/your/manage.py
是你的 Django 專案的 manage.py 檔案的路徑check_product_expiry
是你的自定義管理命令的名稱>> /path/to/logfile.log 2>&1
將輸出和錯誤重定向到一個日誌檔案
-
儲存並退出編輯器(在 nano 中,按 Ctrl+X,然後 Y,然後 Enter)
-
驗證 cron 任務已經新增:
crontab -l
一些常用的 cron 時間設定示例:
- 每天凌晨執行:
0 0 * * *
- 每週一凌晨執行:
0 0 * * 1
- 每月 1 日凌晨執行:
0 0 1 * *
- 每 5 分鐘執行一次:
*/5 * * * *
注意事項:
-
確保路徑正確:使用絕對路徑來指定 Python 直譯器和 manage.py 檔案的位置。
-
環境變數:cron 任務執行在一個有限的環境中。如果你的 Django 專案依賴於特定的環境變數,你可能需要在 cron 任務中設定這些變數,或者使用一個包裝指令碼。
-
虛擬環境:如果你使用虛擬環境,確保啟用它。例如:
0 * * * * /path/to/venv/bin/python /path/to/your/manage.py check_product_expiry >> /path/to/logfile.log 2>&1
-
日誌檔案許可權:確保指定的日誌檔案路徑是可寫的。
-
測試:首次設定後,可以等待一小時看任務是否正常執行,或者臨時修改 cron 設定為更頻繁的間隔進行測試。
-
錯誤處理:定期檢查日誌檔案,確保任務正常執行且沒有錯誤。
透過這種方式,你可以在 Ubuntu 系統上定期自動執行你的 Django 管理命令,實現產品過期狀態的定時檢查和更新。