TIL105. Django:Django Crontabを使用する


📌 この文書では、Djangoでcrontab機能を使用して論理を定期的に実行する方法について説明します.

🌈 Django Crontabの使用


🔥 Django Crontabとは?


🔥 Django Crontabの設定方法


🔥 定期的にDjango Crontabにリクエストを送信


1.Django Crontabとは?


🤔 crontabとは?


✔crontabはlinuxに含まれており、定期的にプログラムを実行するために使用されます.
ААААААААААААААААА
✔DjangoはDjango-crontabを提供し、これらの機能を使いやすくし、インストール後にappを登録する必要があります.
$ pip install django-crontab
# Application definition
DJANGO_APPS = [
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
PROJECT_APPS = [
    'core',
    'users',
    'rooms',
    'contents',
]
THIRD_PARTY_APPS = [
    'corsheaders',
    'django_crontab',
]
INSTALLED_APPS = DJANGO_APPS + PROJECT_APPS + THIRD_PARTY_APPS

2.Django Crontabの設定方法


🤔 簡単なタスクを定期的に実行


毎分次の関数を実行しましょう.そのため、setgins.pyの下部にcrontabをどのサイクルで実行するかを設定する必要があります.
def crontab_every_minute():
    print('hello crontab')
ААААААААААААА\104pyファイルで作成されたと仮定すると、次のように設定できます.
CRONJOBS = [
    ('*/1 * * * *', 'core.cron.crontab_every_minute', '>> '+os.path.join(BASE_DIR, 'config/log/cron.log'),
]
cronを1000 coreアプリケーションに適用します.BASE DIRに従って、/log/cron pyの対応する関数を設定します.ログファイルの設定.
✔¥CRONJABSのリスト形式に複数のタスクを指定し、定期的に実行してログファイルを生成します.
✔¥ただし、上記の設定が成功した場合のみ、ログファイルに実行結果が表示されます.また、エラーをチェックしたい場合は、以下のように設定してください.
CRONJOBS = [
    # ('*/1 * * * *', 'core.cron.crontab_every_minute', '>> '+os.path.join(BASE_DIR, 'config/log/cron.log'),
    ('*/1 * * * *', 'core.cron.crontab_every_minute', '>> '+os.path.join(BASE_DIR, 'config/log/cron.log')+' 2>&1 ')
]

🤔 crontab実行サイクルの設定方法


✔上のcron設定では、/1**は毎分1回を表しています.仕切り基準に基づいてスケジュールを指定できます.
АААААААААААА
✔入り¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
✔¥このほか、カンマ(,)、大文字(-)で間隔や設定範囲を指定することもできます.
例えば、0点、6点、12点、18点を基準として、1日4回経過し、ある論理を実行したい場合は、以下のように指定することができる.
CRONJOBS = [
    ('0 0,6,12,18 * * *', 'core.cron.crontab_every_minute', '>> '+os.path.join(BASE_DIR, 'config/log/cron.log')+' 2>&1 ')
]

🤔 django-crontabコマンド


ビジネスの追加
$ > python manage.py crontab add
✔crontab実行中の業務を確認する
$ > python manage.py crontab show
✔crontabトランザクションから削除
$ > python manage.py crontab show

🤔 操作が許可されていないエラーが発生した場合


✔の上にdjango crontabが設定されていますが、ログファイルに何もない場合は、まずエラーメッセージをログに書き込みます.
ААААААААААААА
✔¥Macはセキュリティが高いので、ライセンスに関する問題が発生した場合は、以下の設定でcrontabを扱うべきです.
ААААААААААААこれはcronというプログラムが許可されていないためです.次のcronを確認するのは、ライセンスが取得されているためです.この方法については、次の内容を参照してください.
✔ААААААААААААААААここで「shift+command+G」と入力し、/usr/sbin/cronと入力すると、cron名の付いた端末アイコンが表示されます.歯を押さえる.
ААААААААААААА\1040cronをチェックしてロックを閉じると、許可されたエラーが解決します.

3.定期的にDjango Crontabにリクエストを送信


🤔 定期的にYoutube APIにリクエストを送信


各勘定科目のユーチューブAPIは、使用に割り当てられているため、自由に使用するには限界があります.
また、各企業が協力している間に、Youtubeの人気ビデオを毎日4回DBに保存し、必要なTableごとに受信したデータを保存するように要求されたことがあります.
✔ААААААААААААААААААААА
✔¥特に、カテゴリに関連した重複不可かつForeign Keyで格納しなければならない値は複数のコンテンツで参照する必要がありますので、データが適切な場所に格納されるように既存の値であるかどうかも確認する必要があります.
import requests
from datetime        import datetime
from django.conf     import settings
from contents.models import Content, ContentCategory, Tag, ContentTag
# 정지적으로 실행될 youtube api 로직
def popular_videos_get_youtube_api():
    search_url = 'https://www.googleapis.com/youtube/v3/videos'       
    params = {
        'part'       : 'snippet,statistics,player,contentDetails,topicDetails',
        'chart'      : 'mostPopular',
        'regionCode' : 'KR',
        'maxResults' : 50,
        'key'        : settings.YOUTUBE_DATA_API_KEY,
    }
    data  = requests.get(search_url, params=params).json()
    items = data['items']
    # category table 저장
    youtube_obj, created = ContentCategory.objects.get_or_create(name = 'youtube')
    count = 0  # 👈 log 파일에 몇 개를 저장됬는지 파악하기 위해 count 변수 선언
    for item in items:
        if not Content.objects.filter(content_link_url = 'https://www.youtube.com/embed/'+item['id']).exists():
            obj = Content.objects.create(
                title                 = item['snippet']['title'],
                content_link_url      = 'https://www.youtube.com/embed/' + item['id'],
                thumbnails_url        = item['snippet']['thumbnails']['medium']['url'],
                running_time          = item['contentDetails']['duration'][2:],
                view_count            = item['statistics'].get('viewCount'),
                like_count            = item['statistics'].get('likeCount'),
                dislike_count         = item['statistics'].get('dislikeCount'),
                channel_id            = item['snippet']['channelId'],
                channel_title         = item['snippet']['channelTitle'],
                published_at          = item['snippet']['publishedAt'],
                content_categories_id = youtube_obj.id,
            )
            count += 1
            # topicDetails 값이 있는 경우에만 tag 테이블 및 content_tag 테이블에 값을 저장
            if item.get('topicDetails'):
                tags = item['topicDetails']['topicCategories']
                for tag in tags:
                    tag_obj, created = Tag.objects.get_or_create(name = tag.split('/')[-1])
                    ContentTag.objects.create(contents_id = obj.id, tags_id = tag_obj.id)
    print(f'{datetime.now()} : {count}/{len(items)} data created') # 👈 log파일에 찍힐 내용

🤔 に感銘を与える


最初のcrontabを実行するたびに、出力値を特定できないため、多くの時間がかかります.printの値は端末に出力されるか、エラーメッセージも出力されると思っていましたが、何の反応もなく、あちこち探して、cronに許可すべき問題を確認して解決しました.
所望の論理が定期的に実行されている場合でも、実際にyoutube APIを要求すると、返されるデータに値が存在しない可能性があるため、エラー・ログは開始時によく理解されるはずです.