」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 Celery 和 Docker 在 Django 中執行 Cron 作業

使用 Celery 和 Docker 在 Django 中執行 Cron 作業

發佈於2024-09-01
瀏覽:211

Running a Cron Job in Django Using Celery and Docker

Cron 作業簡介

cron 作業是依照指定時間間隔自動執行的排程任務。這些任務對於自動執行重複操作(例如發送提醒電子郵件、產生報表或清理資料庫)非常有用。在 Django 專案中,可以使用 Celery 等工具設定 cron 作業,這使得調度和管理任務變得簡單且有效率。

設定您的 Django 項目

我們先建立一個 Django 項目,安裝必要的套件,然後使用 Docker 容器化這個項目。

創建虛擬環境並安裝Django和DRF

  • 開啟終端並導航至專案目錄。
  • 創建並啟動虛擬環境:
python -m venv myenv
source myenv/bin/activate  # On Windows, use myenv\Scripts\activate
  • 安裝 Django 和 Django REST Framework:
pip install django djangorestframework

建立 Django 專案和應用程式

  • 創建一個新的 Django 專案:
django-admin startproject myproject
cd myproject
  • 創建一個新的 Django 應用程式:
python manage.py startapp myapp
  • 將應用程式新增至您的settings.py:
# myproject/settings.py

INSTALLED_APPS = [
    ...
    'myapp',
    'rest_framework',
]

安裝 Celery 和 Redis

  • 安裝 Celery 和 Redis:
pip install celery redis
  • 透過建立 celery.py 檔案在您的專案中設定 Celery:
# myproject/celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

app.conf.beat_schedule = {
    'run-this-task-every-day': {
        'task': 'myapp.tasks.my_scheduled_task',
        'schedule': crontab(minute="00", hour="7"),  # Executes every day at 7 AM
    },
}

app.conf.timezone = 'UTC'
  • 修改init.py以使用Django載入Celery:
# myproject/__init__.py
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ('celery_app',)
  • 在settings.py中配置Celery:
CELERY_BROKER_URL = os.environ.get('REDIS_URL')
CELERY_RESULT_BACKEND = os.environ.get('REDIS_URL')
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True

創建芹菜任務

在您的 Django 應用程式中,在tasks.py 中定義任務:

# myapp/tasks.py
from celery import shared_task

@shared_task
def my_scheduled_task():
    print("This task runs every every day.")

建立 Docker 配置

  • 為 Django 的 api 建立一個 Dockerfile(名為:Dockerfile.myapi):
FROM python:3.8-alpine3.15

ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

WORKDIR /app

COPY requirements.txt /app

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 9000

CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "myproject.wsgi:application"]
  • 為 celery 建立一個 Dockerfile(名為:Dockerfile.myjob)
FROM python:3.8-alpine3.15

ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

WORKDIR /app
COPY requirements.txt /app
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app

CMD ["celery", "-A", "myproject", "worker", "--loglevel=info", "--concurrency=4", "-E", "-B"]
  • 建立一個requirements.txt檔案來列出您的依賴項:
Django==4.2
djangorestframework==3.14.0
celery==5.3.1
redis==5.0.0
  • 建立 docker-compose.yml 檔案來管理服務:
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.myapi
    container_name: myapp_api
    ports:
      - 7000:7000
    env_file:
      - .env

  celery:
    build:
      context: .
      dockerfile: Dockerfile.myjob
    container_name: myapp_job
    depends_on:
      - app
    env_file:
      - .env
  • 建立一個 .env 檔案並在其中加入 Redis URL 值:
REDIS_URL=

建置並運行 Docker 容器

  • 建置並運行 Docker 映像:
docker-compose up --build

這將啟動您的 Django 應用程序,以及 Celery 工作線程和 Celery 節拍調度程序。

驗證 Cron 作業

您的 Celery 任務現在應該根據您定義的時間表運行。您可以查看指定時間的日誌來確認任務正在執行。

結論

使用 Celery、Docker 和 Redis 在 Django 中執行 cron 作業為管理背景任務提供了強大且可擴展的解決方案。 Docker 可確保您的應用程式在不同環境中一致運行,從而使部署更加輕鬆。透過執行上述步驟,您可以有效地自動化任務並輕鬆管理您的 Django 專案。

版本聲明 本文轉載於:https://dev.to/engrmark/running-a-cron-job-in-django-using-celery-and-docker-238d?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用 MinGW 在 Windows 上建置 GLEW?逐步指南。
    如何使用 MinGW 在 Windows 上建置 GLEW?逐步指南。
    使用MinGW 在Windows 上建立GLEW:綜合指南使用GLEW,這是一個無縫整合OpenGL 和WGL 函數的純頭文件庫,使用MinGW 增強Windows 上OpenGL 應用程式的開發。為了使用 MinGW 有效建置 GLEW,需要一組特定的命令和步驟。 首先,建立兩個名為 lib 和 ...
    程式設計 發佈於2024-11-07
  • 如何使用 CSS 創建帶有對角線的雙色調背景?
    如何使用 CSS 創建帶有對角線的雙色調背景?
    使用對角線創建雙色調背景要使用CSS 實現由對角線分為兩部分的背景,請執行以下操作這些步驟:1。建立兩個 Div:建立兩個單獨的 div 來表示兩個背景部分。 2.設定 Div 樣式:將下列 CSS 套用至 div:.solid-div { background-color: [solid co...
    程式設計 發佈於2024-11-07
  • 文件的力量:閱讀如何改變我在 JamSphere 上使用 Redux 的體驗
    文件的力量:閱讀如何改變我在 JamSphere 上使用 Redux 的體驗
    作為開發人員,我們經常發現自己一頭扎進新的庫或框架,渴望將我們的想法變為現實。跳過文件並直接跳到編碼的誘惑很強烈——畢竟,這有多難呢?但正如我透過建立音樂管理平台 JamSphere 的經驗所了解到的那樣,跳過這一關鍵步驟可能會將順利的旅程變成充滿挑戰的艱苦戰鬥。 跳過文檔的魅力 ...
    程式設計 發佈於2024-11-07
  • 如何在PHP多子網域應用中精準控制Cookie域?
    如何在PHP多子網域應用中精準控制Cookie域?
    在PHP 中控制Cookie 域和子域在PHP 中控制Cookie 域和子域建立多子網域網站時,必須控制會話cookie 的網域確保每個子網域的正確會話管理。然而,手動設定網域時,PHP 的 cookie 處理似乎存在差異。 header("Set-Cookie: cookiename=c...
    程式設計 發佈於2024-11-07
  • 如何取得已安裝的 Go 軟體包的完整清單?
    如何取得已安裝的 Go 軟體包的完整清單?
    檢索Go 中已安裝軟體包的綜合清單在多台電腦上傳輸Go 軟體包安裝時,有必要取得詳細的清單所有已安裝的軟體包。本文概述了此任務的簡單且最新的解決方案。 解決方案:利用“go list”與過時的答案相反,當前的建議列出Go 中已安裝的軟體包是使用“go list”命令。透過指定三個文字句點 ('...
    程式設計 發佈於2024-11-07
  • Java中的三元運算子可以不回傳值嗎?
    Java中的三元運算子可以不回傳值嗎?
    三元運算子:深入研究程式碼最佳化三元運算子:深入研究程式碼最佳化雖然三元運算子(?:) 是Java 中的一個強大工具,但它了解其限制至關重要。一個常見的誤解是可以在不傳回值的情況下使用它。 與這種看法相反,Java 不允許在沒有 return 語句的情況下進行三元運算。三元運算子的目的是評估條件並將...
    程式設計 發佈於2024-11-07
  • 為什麼您應該在下一個 PHP 專案中嘗試 Lithe?
    為什麼您應該在下一個 PHP 專案中嘗試 Lithe?
    Lithe 是尋求簡單性與強大功能之間平衡的開發人員的完美 PHP 框架。如果您厭倦了使開發緩慢且令人困惑的繁瑣框架,Lithe 提供了一種極簡但極其靈活的方法,旨在使您的工作更快、更有效率。 1. 輕量且超快 Lithe 的開發重點是輕量級,允許您以很少的開銷創建應用程式。與其他...
    程式設計 發佈於2024-11-07
  • 如何處理 Android 中的網路連線變更?
    如何處理 Android 中的網路連線變更?
    處理Android 中的互聯網連接變化問題集中在需要一個可以監視互聯網連接變化的廣播接收器,因為現有代碼僅檢測連接變化。 為了解決這個問題,這裡有一個替代方法:public class NetworkUtil { public static final int TYPE_WIFI = 1; ...
    程式設計 發佈於2024-11-07
  • Python 3.x 的 Super() 在沒有參數的情況下如何運作?
    Python 3.x 的 Super() 在沒有參數的情況下如何運作?
    Python 3.x 的超級魔法:解開謎團Python 3.x 在其super() 方法中引入了令人驚訝的轉折,允許無參數呼叫。這種看似無害的改變在幕後卻帶來了重大的後果和內在的魔力。 揭開魔力為了維護 DRY 原則,新的 super() 行為繞過了顯式類別命名。它有一個特殊的 class 單元,用...
    程式設計 發佈於2024-11-07
  • Tailwind Flex:Flexbox 實用程式初學者指南
    Tailwind Flex:Flexbox 實用程式初學者指南
    Tailwind Flex 提供了一种创建响应式布局的有效方法,无需编写复杂的 CSS。通过使用 flex、flex-row 和 flex-col 等简单的实用程序,您可以轻松对齐和排列元素。 Tailwind Flex 非常适合希望简化布局创建同时保持对对齐、方向和间距的完全控制的开发人员 - 所...
    程式設計 發佈於2024-11-07
  • ETL:從文字中提取人名
    ETL:從文字中提取人名
    假設我們想要抓取chicagomusiccompass.com。 如你所見,它有幾張卡片,每張卡片代表一個事件。現在,讓我們來看看下一篇: 注意事件名稱是: jazmin bean: the traumatic livelihood tour 所以現在的問題是:我們要如何從文本中提取藝術家的名字?...
    程式設計 發佈於2024-11-07
  • 如何控制 C++ ostream 輸出中的浮點精度?
    如何控制 C++ ostream 輸出中的浮點精度?
    在Ostream 輸出中維護浮點精度在Ostream 輸出中維護浮點精度在C 中,在ostream 運算中使用“
    程式設計 發佈於2024-11-07
  • 如何保證PHP會話的安全銷毀?
    如何保證PHP會話的安全銷毀?
    確保銷毀 PHP 會話儘管資訊存在衝突,但仍有有效的方法可以安全地消除 PHP 會話。要實現此最終終止,遵循多步驟流程至關重要。 會話終止的基本步驟刪除會話資料:啟動會話後與session_start() 一起,使用unset() 刪除與特定會話變數關聯的任何儲存數據,例如$_SESSION[...
    程式設計 發佈於2024-11-07
  • 為什麼我的 MongoDB 文件在 Go 中使用 TTL 索引 5 秒後沒有過期?
    為什麼我的 MongoDB 文件在 Go 中使用 TTL 索引 5 秒後沒有過期?
    在Go 中使用MongoDB 在指定的秒數後使文件過期使用TTL 索引,MongoDB 允許您在指定的秒數後自動使文件過期期間。本文示範如何使用官方 mongo-go-driver 在 Go 中實現此目的。 按照MongoDB 文檔,程式碼顯示如何:建立帶有expireAfterSeconds 的索...
    程式設計 發佈於2024-11-07
  • 使用 JetForms 簡化表單管理:完整指南
    使用 JetForms 簡化表單管理:完整指南
    在當今的數位環境中,管理表單提交很快就會變得不堪重負,特別是當您跨不同平台處理多個表單時。無論是網站上的簡單聯絡表單還是產品的全面調查,手動維護表單提交都是一件麻煩事。這就是 JetForms 的用武之地——一個簡化流程、節省您時間和精力的精簡平台。 在本指南中,我將引導您了解如何開始使用 Jet...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3