Django 관리자에서 셀러리 비트를 사용하고 일정을 관리하는 데이터베이스 스케줄러

Must read previous post first before reading this one :D



이 게시물의 목표


  • django 프로젝트에 celery beat를 설치하고 사용 방법 이해
  • gmail을 사용하여 django 프로젝트에서 이메일을 보내기 위한 설정
  • 이메일을 전송하는 작업 생성
  • django admin을 사용하여 일정을 만들고 이메일 작업과 통합
    예) 매주 금요일 오전 4시에 사용자에게 알림 메일 발송

  • 셀러리 비트는 무엇입니까?



    셀러리 비트는 스케줄러입니다. 작업을 실행할 시간이 되면 작업자 노드에 항목을 전달합니다. (정기 태스크 실행)

    셀러리 비트 설치pip install django-celery-beat
    마이그레이션 - 작업 및 일정을 저장하기 위해 테이블이 생성됩니다.python manage.py migrate
    settings.py

    INSTALLED_APPS = (
        ...,
        'django_celery_beat',
    )
    


    이메일 설정



    1 . 클릭 Manage your Google Account

    2 . 보안 > 2단계 인증에서 2 step verification가 켜져 있는지 확인하세요.


    삼 . 생성app password . 앱 비밀번호 > 앱 선택 > 기타 > 이름을 무엇이든 지정하세요!



    4 . 추가settings.py
    # e-mail settings
    EMAIL_USE_TLS = True
    EMAIL_PORT = 587
    EMAIL_HOST = 'smtp.gmail.com'
    EMAIL_HOST_USER = {YOUR EMAIL ADDRESS}
    EMAIL_HOST_PASSWORD = {YOUR PASSWORD FROM NO.3}
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    


    이메일 설정 완료!

    셀러리가 매장 작업 및 일정을 능가하는 곳은 어디입니까?



    1. 기본 항목은 beat_schedule 설정에서 가져옵니다.



    task.py

    app.conf.beat_schedule = {
      'add-every-30-seconds': {
            'task': 'tasks.add',
            'schedule': 30.0,
            'args': (16, 16)
        },
    }
    app.conf.timezone = 'UTC'
    



    또는 일정을 더 많이 제어하려면 crontab를 사용하십시오.

    from celery.schedules import crontab
    
    app.conf.beat_schedule = {
        # Executes every Monday morning at 7:30 a.m.
        'add-every-monday-morning': {
            'task': 'tasks.add',
            'schedule': crontab(hour=7, minute=30, day_of_week=1),
            'args': (16, 16),
        },
    }
    


    셀러리 비트 서비스 시작celery -A <project name> beat

    2 . 사용자 지정 저장소 사용 - 데이터베이스에 저장하겠습니다.


  • 사용자에게 이메일을 보내는 작업을 생성해 보겠습니다.

  • @app.task(name="send_notification", bind=True, default_retry_delay=300, max_retries=5)
    def send_notification(self, subject, message):
        from django.core.mail import send_mail as sm
    
        # Fetch all users except superuser
        users = User.objects.exclude(is_superuser=True).all()
        user_emails = [user.email for user in users]
    
        # try sending email
        try:
            res = sm(
                subject=subject,
                html_message=message,
                from_email=EMAIL_HOST_USER,
                recipient_list=user_emails,
                fail_silently=False,
                message=None)
            print(f'Email send to {len(user_emails)} users')
        except Exception:
    
            # retry when fail
            send_notification.retry()
    
    


    그래서 여기에 send_notification라는 작업을 만들었습니다.default_retry_delay : 실패 시 300초 후에 다시 시도max_retries : 5번만 더 재시도한 다음 중지합니다.
    여기서 나는 또한 subjectmessage를 인수로 받고 있습니다. 이것은 django admin에서 subjectmessage를 전달할 수 있음을 의미합니다. 이것은 나중에 보여드리겠습니다.
  • 장고 관리자로 이동하자localhost:8080/admin .

  • Periodic Tasks 메뉴가 표시됩니다.

    crontab Crontab 만들기 > crontab 추가


    crontab을 만들어 보겠습니다. 여기에서 하나를 만들었습니다. Every Saturday @ 10:47 p.m. crontab에 대해 잘 모르는 경우 이 항목을 확인하십시오Crontab examples.


    주기적인 작업을 만들어 봅시다Periodic tasks > Add 를 클릭합니다. 원하는 새 이름을 만듭니다. 거기에 생성한 작업 찾기send_notification
    Schedule > Crontab Schedule > 방금 생성한 crontab를 찾습니다.
    추가 Start Datetime

    여기에서 subjectmessage 인수를 전달합니다.


    이제 모든 준비가 완료되었습니다.

    django 서버 시작, rabbitmq 시작

    셀러리 시작celery -A djangocelery(app name) worker --loglevel=info
    다른 터미널에서 셀러리 비트 시작celery -A djangocelery(app name) beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
    셀러리비트의 종점을 확인해보자

    @오후 10시 47분 셀러리 비트 스케줄러가 우리가 만든 작업send_notification을 보내고 있습니다!! 셀러리까지!!


    셀러리 터미널을 확인하십시오. Celery가 작업을 수신하고 이메일을 보냈습니다.


    그리고 오후 10시 47분에 이메일을 받았습니다. django admin에서 설정한 제목과 내용으로 토요일에!


    결론



    따라서 celery beatscheduler이고 celerytask를 실행하는 것입니다. Database scheduler는 작업 및 일정이 데이터베이스에 저장되어 django admin에서 관리할 수 있는 셀러리 비트 방법 중 하나입니다.

    장고 셀러리 비트는 여기까지입니다!
    끝.

    좋은 웹페이지 즐겨찾기