Django-예약 된 작업을 설정 하시겠습니까?
Django를 사용하여 웹 응용 프로그램을 개발하고 있으며 정기적으로 작업을 예약하는 방법이 있는지 궁금합니다.
기본적으로 데이터베이스를 실행하고 자동으로 정기적으로 계산 / 업데이트를하고 싶지만이 작업에 대한 문서를 찾을 수없는 것 같습니다.
누구든지 이것을 설정하는 방법을 알고 있습니까?
명확히하기 위해 : cron
이 작업을 수행 할 수 있다는 것을 알고 있지만 장고 에이 기능을 제공하는 기능이 있는지 궁금합니다. 사람들이 많은 구성 (바람직하게는 0)을 수행하지 않고도이 응용 프로그램을 직접 배포 할 수 있기를 바랍니다.
요청이 사이트에 마지막으로 전송 된 이후 작업이 실행되어야하는지 여부를 간단히 확인하여 이러한 작업을 "반복적으로"트리거하는 것을 고려했지만 조금 더 깨끗한 것을 원합니다.
내가 고용 한 해결책은 다음과 같습니다.
1) 만들기 사용자 지정 관리 명령을 , 예를 들어,
python manage.py my_cool_command
2) 필요한 시간 cron
에 (Linux) 또는 at
(Windows)를 사용하여 명령을 실행하십시오.
이 솔루션은 AMQP 스택을 많이 설치할 필요가없는 간단한 솔루션입니다. 그러나 다른 답변에서 언급 한 Celery와 같은 것을 사용하면 좋은 이점이 있습니다. 특히 Celery를 사용하면 응용 프로그램 논리를 crontab 파일로 분산시킬 필요가 없습니다. 그러나 크론 솔루션은 중소 규모의 응용 프로그램과 많은 외부 종속성을 원하지 않는 곳에서 매우 잘 작동합니다.
편집하다:
이후 버전의 Windows에서는이 at
명령이 Windows 8, Server 2012 이상에서 더 이상 사용되지 않습니다. schtasks.exe
같은 용도로 사용할 수 있습니다 .
**** UPDATE **** 이것은 사용자 지정 관리 명령을 작성하기위한 django doc 의 새로운 링크 입니다.
Celery 는 AMQP (RabbitMQ)를 기반으로하는 분산 작업 대기열입니다. 또한 주기적 작업을 크론과 같은 방식 으로 처리합니다 ( 정기 작업 참조 ). 앱에 따라 그만한 가치가 있습니다.
Celery는 django ( docs )를 사용하여 설정하기가 매우 쉬우 며 정기적 인 작업은 실제로 가동 중지 시간이 발생할 경우 누락 된 작업을 건너 뜁니다. Celery에는 작업이 실패 할 경우를 위해 내장 된 재시도 메커니즘이 있습니다.
우리는 내가 구조화 된 응용 프로그램이라고 생각하는 것을 오픈 소스했습니다. 브라이언의 해결책은 위와 같습니다. 모든 피드백을 좋아할 것입니다!
https://github.com/tivix/django-cron
하나의 관리 명령이 제공됩니다.
./manage.py runcrons
그것은 일을한다. 각 크론은 클래스 (모두 OO)로 모델링되고 각 크론은 다른 빈도로 실행되며 동일한 크론 유형이 병렬로 실행되지 않도록합니다 (크론 자체가 주파수보다 실행하는 데 시간이 오래 걸리는 경우)!
감사!
표준 POSIX OS를 사용하는 경우 cron 을 사용 합니다.
Windows를 사용하는 경우 at 을 사용 합니다.
장고 관리 명령을
그들이 어떤 플랫폼에 있는지 파악하십시오.
어느 사용자를위한 명령 "AT"적절한 실행, 또는 사용자의 crontab을 업데이트합니다.
흥미로운 새로운 플러그 형 장고 앱 : 장고 크로노 그래프
타이머 역할을하는 하나의 cron 항목 만 추가하면되며 스크립트에 Django 관리 인터페이스가 매우 훌륭하게 실행됩니다.
스팸봇, 검색 엔진 인덱싱 로봇 등을 사용하여 일정 간격으로 예약 된 작업을 실행하는 Django 앱인 Django Poor Man 's Cron을 살펴보십시오.
참조 : http://code.google.com/p/django-poormanscron/
cron을 통해 관리 명령을 실행하는 Brian Neal의 제안은 잘 작동하지만 조금 더 강력한 것을 찾고 있다면 (Celery만큼 정교하지는 않지만) Kronos 와 같은 라이브러리를 살펴보십시오 .
# app/cron.py
import kronos
@kronos.register('0 * * * *')
def task():
pass
RabbitMQ와 Celery는 Cron보다 더 많은 기능과 작업 처리 기능을 가지고 있습니다. 작업 실패가 문제가되지 않고 다음 호출에서 깨진 작업을 처리 할 것으로 생각되면 Cron이면 충분합니다.
Celery & AMQP 를 사용하면 깨진 작업을 처리 할 수 있으며 작업 max_retries
속성에 도달 할 때까지 다른 작업자 (셀러리 작업자가 다음 작업을 수신 대기)에 의해 다시 실행됩니다 . 실패를 기록하거나 관리자에게 이메일을 보내면 실패와 같은 실패시 작업을 호출 할 수도 있습니다 max_retries
.
또한 응용 프로그램을 확장해야 할 때 Celery 및 AMQP 서버를 배포 할 수 있습니다.
나는 개인적으로 cron을 사용하지만 django-extensions 의 Jobs Scheduling 부분 은 흥미로워 보입니다.
Django의 일부는 아니지만 Airflow 는 작업 관리에 유용한 최신 프로젝트입니다 (2016 년 기준).
에어 플로우는 데이터 파이프 라인을 작성하고 관리하는 데 사용할 수있는 워크 플로우 자동화 및 스케줄링 시스템입니다. 웹 기반 UI는 개발자에게 이러한 파이프 라인을 관리하고 볼 수있는 다양한 옵션을 제공합니다.
기류는 Python으로 작성되었으며 Flask를 사용하여 빌드됩니다.
에어 플로우는 에어 비앤비의 Maxime Beauchemin이 2015 년 봄에 오픈 소스로 만들었습니다. 2016 년 겨울 아파치 소프트웨어 재단의 인큐베이션 프로그램에 합류했습니다. Git 프로젝트 페이지 와 추가 배경 정보 는 다음과 같습니다 .
얼마 전에 정확히 동일한 요구 사항이 있었으며 APScheduler ( User Guide )를 사용하여 해결했습니다.
스케줄링 작업을 매우 간단하게 만들고 일부 코드의 요청 기반 실행과 독립적으로 유지합니다. 다음은 코드에서 사용한 간단한 예입니다.
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
job = None
def tick():
print('One tick!')\
def start_job():
global job
job = scheduler.add_job(tick, 'interval', seconds=3600)
try:
scheduler.start()
except:
pass
이것이 누군가를 돕기를 바랍니다!
cron.py 파일의 맨 위에 다음을 입력하십시오.
#!/usr/bin/python
import os, sys
sys.path.append('/path/to/') # the parent directory of the project
sys.path.append('/path/to/project') # these lines only needed if not on path
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'
# imports and code below
방금이 간단한 솔루션에 대해 생각했습니다.
- URL보기를 사용하여 다른보기와 마찬가지로 보기 함수 do_work (req, param)를 정의하고 HttpResponse를 리턴하십시오.
- curl http : // localhost / your / mapped / url? param = value 를 실행하는 타이밍 환경 설정 (또는 Windows에서 AT 또는 예약 된 작업 사용)으로 크론 작업을 설정 하십시오 .
매개 변수를 추가 할 수 있지만 URL에 매개 변수 만 추가하면됩니다.
너희들이 어떻게 생각하는지 말해줘
[업데이트] 이제 curl 대신 django-extensions 에서 runjob 명령을 사용하고 있습니다.
내 cron은 다음과 같습니다.
@hourly python /path/to/project/manage.py runjobs hourly
... 매일, 매월 등을 위해 '등등. 특정 작업을 실행하도록 설정할 수도 있습니다.
더 다루기 쉽고 깨끗합니다. URL을 뷰에 매핑 할 필요가 없습니다. 작업 클래스와 crontab을 정의하기 만하면됩니다.
코드의 일부 후에 내 views.py와 같은 것을 작성할 수 있습니다. :)
#######################################
import os,sys
sys.path.append('/home/administrator/development/store')
os.environ['DJANGO_SETTINGS_MODULE']='store.settings'
from django.core.management impor setup_environ
from store import settings
setup_environ(settings)
#######################################
에서 http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/
django-q를 꼭 확인해야합니다! 추가 구성이 필요하지 않으며 상업 프로젝트의 생산 문제를 처리하는 데 필요한 모든 것이 있습니다.
그것은 적극적으로 개발되었으며 django, django ORM, mongo, redis와 매우 잘 통합됩니다. 내 구성은 다음과 같습니다.
# django-q
# -------------------------------------------------------------------------
# See: http://django-q.readthedocs.io/en/latest/configure.html
Q_CLUSTER = {
# Match recommended settings from docs.
'name': 'DjangoORM',
'workers': 4,
'queue_limit': 50,
'bulk': 10,
'orm': 'default',
# Custom Settings
# ---------------
# Limit the amount of successful tasks saved to Django.
'save_limit': 10000,
# See https://github.com/Koed00/django-q/issues/110.
'catch_up': False,
# Number of seconds a worker can spend on a task before it's terminated.
'timeout': 60 * 5,
# Number of seconds a broker will wait for a cluster to finish a task before presenting it again. This needs to be
# longer than `timeout`, otherwise the same task will be processed multiple times.
'retry': 60 * 6,
# Whether to force all async() calls to be run with sync=True (making them synchronous).
'sync': False,
# Redirect worker exceptions directly to Sentry error reporter.
'error_reporter': {
'sentry': RAVEN_CONFIG,
},
}
나는 오늘 당신의 문제와 비슷한 것을 가지고있었습니다.
나는 서버 trhough cron에 의해 처리되기를 원하지 않았습니다 (그리고 대부분의 라이브러리는 결국 cron 도우미였습니다).
그래서 예약 모듈을 만들고 init에 첨부했습니다 .
가장 좋은 방법은 아니지만 모든 코드를 한곳에서 실행하고 기본 앱과 관련하여 실행하는 데 도움이됩니다.
예, 위의 방법은 너무 좋습니다. 그리고 나는 그들 중 일부를 시도했습니다. 마침내 다음과 같은 방법을 찾았습니다.
from threading import Timer
def sync():
do something...
sync_timer = Timer(self.interval, sync, ())
sync_timer.start()
재귀 처럼 .
좋아,이 방법이 귀하의 요구 사항을 충족시킬 수 있기를 바랍니다. :)
Celery와 비교하여보다 현대적인 솔루션은 Django Q입니다 : https://django-q.readthedocs.io/en/latest/index.html
훌륭한 문서를 가지고 있으며 이해하기 쉽습니다. Windows는 프로세스 포크를 지원하지 않기 때문에 Windows 지원이 부족합니다. 그러나 Windows for Linux Subsystem을 사용하여 개발 환경을 만들면 제대로 작동합니다.
셀러리를 사용하여 정기적 인 작업을 만듭니다. 먼저 다음과 같이 설치해야합니다.
pip install django-celery
django-celery
설정 에 등록하는 것을 잊지 마십시오. 그러면 다음과 같이 할 수 있습니다 :
from celery import task
from celery.decorators import periodic_task
from celery.task.schedules import crontab
from celery.utils.log import get_task_logger
@periodic_task(run_every=crontab(minute="0", hour="23"))
def do_every_midnight():
#your code
시스템의 다른 사용자에게 실제 서버 (Windows) 작업 스케줄러에 대한 액세스 권한을 부여하지 않고 작업을 예약하도록 제공해야했기 때문에 이것이 누군가에게 유용하다는 것을 확신하지 못합니다.이 재사용 가능한 앱을 만들었습니다.
사용자는 필요한 command / task / .bat 파일을 생성 할 수있는 서버의 하나의 공유 폴더에 액세스 할 수 있습니다. 그런 다음이 앱을 사용하여이 작업을 예약 할 수 있습니다.
앱 이름은 Django_Windows_Scheduler
스케줄러 작업을위한 Django APScheduler. APScheduler (Advanced Python Scheduler)는 Python 코드가 한 번 또는 주기적으로 나중에 실행되도록 예약 할 수있는 Python 라이브러리입니다. 원하는대로 새 작업을 추가하거나 이전 작업을 제거 할 수 있습니다.
참고 : 저는이 도서관의 저자입니다
APScheduler 설치
pip install apscheduler
호출 할 파일보기 기능
파일 이름 : scheduler_jobs.py
def FirstCronTest():
print("")
print("I am executed..!")
스케줄러 구성
execute.py 파일을 만들고 아래 코드를 추가하십시오.
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
작성한 함수 여기에서 스케줄러 함수는 scheduler_jobs로 작성됩니다.
import scheduler_jobs
scheduler.add_job(scheduler_jobs.FirstCronTest, 'interval', seconds=10)
scheduler.start()
실행할 파일 연결
이제 Url 파일의 맨 아래에 아래 줄을 추가하십시오.
import execute
- https://github.com/devchandansh/django-apscheduler를 실행하여 전체 코드를 확인할 수 있습니다
당신이 더 많은 것을 원하는 경우 신뢰할 수있는 것보다 셀러리를 시도 TaskHawk 의 상단에 내장되어 AWS SQS / SNS를 .
참조 : http://taskhawk.readthedocs.io
간단한 도커 프로젝트의 경우 기존 답변이 실제로 맞지 않았습니다.
그래서 외부 라이브러리 나 트리거가 필요없는 매우 베어 본 솔루션을 작성했습니다. 외부 os-cron이 필요하지 않으며 모든 환경에서 작동해야합니다.
미들웨어를 추가하여 작동합니다. middleware.py
import threading
def should_run(name, seconds_interval):
from application.models import CronJob
from django.utils.timezone import now
try:
c = CronJob.objects.get(name=name)
except CronJob.DoesNotExist:
CronJob(name=name, last_ran=now()).save()
return True
if (now() - c.last_ran).total_seconds() >= seconds_interval:
c.last_ran = now()
c.save()
return True
return False
class CronTask:
def __init__(self, name, seconds_interval, function):
self.name = name
self.seconds_interval = seconds_interval
self.function = function
def cron_worker(*_):
if not should_run("main", 60):
return
# customize this part:
from application.models import Event
tasks = [
CronTask("events", 60 * 30, Event.clean_stale_objects),
# ...
]
for task in tasks:
if should_run(task.name, task.seconds_interval):
task.function()
def cron_middleware(get_response):
def middleware(request):
response = get_response(request)
threading.Thread(target=cron_worker).start()
return response
return middleware
models/cron.py
:
from django.db import models
class CronJob(models.Model):
name = models.CharField(max_length=10, primary_key=True)
last_ran = models.DateTimeField()
settings.py
:
MIDDLEWARE = [
...
'application.middleware.cron_middleware',
...
]
간단한 방법은 사용자 정의 쉘 명령을 작성하는 것입니다. Django Documentation을 참조 하고 Linux에서 cronjob을 사용하여 실행하십시오. 그러나 셀러리와 연결된 RabbitMQ와 같은 메시지 브로커를 사용하는 것이 좋습니다. 이 튜토리얼을 살펴볼 수도 있습니다.
참고 URL : https://stackoverflow.com/questions/573618/django-set-up-a-scheduled-job
'Programming' 카테고리의 다른 글
“현재 중단 점에 도달하지 않습니다. (0) | 2020.02.13 |
---|---|
파이썬에서 나쁜 / 잘못된 인수 조합에 대해 어떤 예외를 제기해야합니까? (0) | 2020.02.13 |
localStorage 값의 최대 크기는 얼마입니까? (0) | 2020.02.13 |
R을 다시 시작하지 않고 패키지를 언로드하는 방법 (0) | 2020.02.13 |
C ++에서 개인 정적 멤버를 초기화하는 방법은 무엇입니까? (0) | 2020.02.13 |