paint-brush
Huey ile tanışın: Django için Kereviz Alternatifiile@udit001
576 okumalar
576 okumalar

Huey ile tanışın: Django için Kereviz Alternatifi

ile Udit11m2024/06/14
Read on Terminal Reader

Çok uzun; Okumak

Huey, Kereviz eşzamansız arka plan görev kuyruğuna hafif, yapılandırması kolay bir alternatiftir. Güvenilir görev yönetimi sunarken karmaşıklığı azaltan daha basit bir çözüm arıyorsanız Huey, projeniz için mükemmel seçim olabilir. Huey'in işlevsellikten ödün vermeden süreci nasıl kolaylaştırdığını keşfedin.
featured image - Huey ile tanışın: Django için Kereviz Alternatifi
Udit HackerNoon profile picture
0-item


Arka plan

O yüzden bugün Kereviz'e göre çok daha kolay kurulumla gelen ve Kereviz'e göre boyutları çok daha küçük olan Huey isimli bir Kereviz alternatifinden bahsedeceğim.


Huey'i denemeye karar vermemin nedeni, bazen Kereviz ile bazı ortak görevleri yaparken bazı sorunlarla karşılaşmamdı çünkü dokümantasyon çok iyi değildi.


Kereviz'in ne olduğunu bilmeyen veya daha önce kullanmamış olanlar için Huey, arka planda zamanlanmış görevleri veya uzun süren görevleri gerçekleştirmenize olanak tanıyan eşzamansız bir görev kuyruğudur.

Önkoşullar

Aşağıdaki paketleri kuracağız:

  • redis
  • Django
  • Huey
  • istekler (isteğe bağlı, demo için gerekli)

GitHub Deposu

Aşağıdaki blog, oluşturacağımız demo projesini test etmek için kullanabileceğiniz bir GitHub deposuyla birlikte geliyor.


Repo'yu görüntülemek için buraya tıklayın.

Proje Kurulumu

Proje Dizinini Oluşturun

Terminali açın ve bir dizin oluşturmak için aşağıdakini yazın; bu adımı atlayabilir ve bunu Dosya Gezgini'nin kendisinden yapabilirsiniz.

 mkdir huey_demo

Sanal çevre

  • Proje bağımlılıklarımızı kurmak için önce bir virtualenv oluşturalım:

     python -m venv venv


  • Virtualenv'i etkinleştirin (Linux):

     source venv/bin/activate

Bağımlılıkları Yükleme

Tüm bağımlılıkları yüklemek için terminale aşağıdaki komutu yazın:

 pip install Django==4.0.4 redis==4.2.2 huey==2.4.3


Bu makaleyi yazarken bunlar, bu kurulumu test ettiğim sürümlerdi; gelecekteki en son sürüme göre güncellemeler için Github Repo'yu takip edin.

Projeyi Oluştur

  • Terminalde aşağıdaki komutu yazarak Django projesini oluşturun:

     django-admin startproject django_huey_demo


  • Dizini Django proje dizinine değiştirin:

     cd django_huey_demo


  • Projemiz kapsamında uygulamayı oluşturun:

     python manage.py startapp demo


  • Oluşturulan uygulamayı settings.py projesine ekleyin, aşağıdaki değişiklikleri yapın:

     INSTALLED_APPS = [ # Existing Apps "demo.apps.DemoConfig", # <== Add this line ]


  • settings.py dosyasında hata ayıklama modunu False olarak ayarlayın:

     DEBUG=False

    Huey'in üretimde nasıl çalıştığını görebilmemiz için Debug'ı False'a ayarlıyoruz, bu konuya daha sonra değineceğiz.

Projeye Genel Bakış

Artık projemizi oluşturmayı bitirdiğimize göre, bugün inşa edeceğimiz şeyin sorumluluğunu size almanın tam zamanı.


Wordnik API'sinden günlük olarak "Günün Sözü"nü getireceğiz. Daha sonra kelimeyi, tanımını ve kelimenin cümle içindeki örneğini veri tabanımızda saklayacağız.


Huey'i kullanarak Günün Sözünü alıp saklayacak periyodik bir görev oluşturacağız.


Kelimeyi saklamak için aynı Django Modelini oluşturacağız.

Wordnik API Anahtarını Alma

API anahtarını almak için bu kılavuzu takip edebilirsiniz.

Projemizi Kodlama

Huey'i Projemize Ekleyin

Projemizin yüklü uygulamalarına Huey'i eklememiz gerekiyor, bu yüzden settings.py dosyasında aşağıdaki değişiklikleri yapın:

 INSTALLED_APPS = [ # Existing apps 'huey.contrib.djhuey', # <== Add this line ]

Redis'i yükleyin

Kereviz'de de yaptığımız gibi sıradaki görevlerle ilgili bilgileri depolamak için Redis for Huey'i kurmamız gerekiyor. Redis'i kendi işletim sisteminize göre yüklemek için aşağıdaki bağlantıya başvurabilirsiniz.


Docker'ı kullanmakta rahatsanız aşağıdaki komutu kullanabilirsiniz:

 docker run --name redis_huey -p 6379:6379 -d redis

Huey varsayılan olarak localhost:6379 üzerinde çalışan Redis sunucusuna bağlanmayı deneyecektir. Eğer mevcut değilse, bir hata ortaya çıkaracaktır.

Model Tanımı

  1. demo/models.py dosyanıza aşağıdaki kodu ekleyin:

     from django.db import models class Word(models.Model): word = models.CharField(max_length=200) part_of_speech = models.CharField(max_length=100) definition = models.TextField() example = models.TextField() def __str__(self): return self.word


  2. Geçişler yapın:

     python manage.py makemigrations demo


  3. Geçişleri uygula:

     python manage.py migrate demo

Görev Tanımı

Demo uygulama dizininde tasks.py adlı bir dosya oluşturun. Dosyamıza tasks.py adını vermemizin nedeni, Huey'in kayıtlı uygulamalarımızda mevcut olan görevleri otomatik olarak keşfetmesine yardımcı olmaktır; eğer dosyamıza bunun dışında bir ad verirsek, görevimizi manuel olarak kaydetmemiz gerekir. Daha fazla bilgi edinmek isterseniz buradan Huey belgelerine göz atabilirsiniz.


Görev tanımını yazmadan önce ek bir bağımlılık requests yüklememiz gerekiyor. Terminalinize aşağıdakini yazarak yükleyin:

 pip install requests==2.27.1


Şimdi kod geliyor:

 import requests from django.conf import settings from huey import crontab from huey.contrib.djhuey import db_periodic_task from demo.models import Word @db_periodic_task(crontab(hour="18", minute="00")) def fetch_daily_word(): r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}") data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] )


Proje ayarlarınıza aşağıdaki satırı ekleyin:

 WORDNIK_API_KEY = "api-key-here"


Bu kod bloğunun anlaşılması çok fazla şey gerektirebilir, o yüzden hadi içindekileri tek tek gözden geçirelim:


  1. Huey Dekoratör

     from huey.contrib.djhuey import db_periodic_task

    Bu, veritabanıyla çalışmayı içeren periyodik görevleri kaydetmek için Huey tarafından sağlanan bir dekoratördür, bu dekoratör, görev tamamlandıktan sonra veritabanı bağlantısını otomatik olarak kapatır, daha fazla ayrıntı için buraya başvurabilirsiniz.


  2. Crontab Programı

     @db_periodic_task(crontab(hour="18", minute="00"))


    crontab(hour="18", minute="00") argümanını periyodik görev dekoratörümüze iletiyoruz, bu Huey'e görevimizi her gün akşam 6'da çalıştırmasını söylüyor. Crontab programlarınızı oluşturmak için bu web sitesinden yararlanabilirsiniz, ben her zaman kullanıyorum.


  3. Wordnik API Anahtarı

     from django.conf import settings # Usage ## settings.WORDNIK_API_KEY

    from django.conf import settings proje ayarlarımızdaki herhangi bir veriyi içe aktarmanın standart yoludur; farklı ortamlar için ayarlanmış birden fazla ayar dosyamızın olduğu durumlarda kullanışlıdır, böylece bizim endişelenmemize gerek kalmadan hangi dosyadan seçileceğini bilir. BT. DJANGO_SETTINGS_MODULE ortam değişkeninden hangi ayar dosyasını kullandığımızı bulur. Ancak bu ayrıntılar hakkında endişelenmenize gerek yok.


    Daha sonra Wordnik API çağrımızda anahtarı kullanıyoruz.


  4. Wordnik API Çağrısı

     r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}")

    Burada kimlik doğrulama için API Key'imizi geçirirken Wordnik API'sine GET isteği yapmak için request modülünü kullanıyoruz.


  5. Kelimeyi veritabanına kaydetme

     data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] )

    API yanıtını ayrıştırdıktan sonra kelime tanımını veritabanımıza kaydediyoruz. Burada create yöntemi yerine get_or_create yöntemini kullanıyoruz, böylece aynı kelimenin Wordnik API tarafından tekrarlanması durumunda veritabanımızda birden fazla kopyasını oluşturmayız.


  6. Wordnik API Yanıtı

    İşte Günün Sözü uç noktası için Wordnik API yanıtının nasıl göründüğü. Yanıtın ilgisiz bölümlerinden bazıları, konuyu kısaltmak amacıyla kısaltılmıştır.

     { "word": "stolon", "definitions": [ { "source": "ahd-5", "text": "A long thin stem that usually grows horizontally along the ground and produces roots and shoots at widely spaced nodes, as in a strawberry plant.", "note": null, "partOfSpeech": "noun" }, // More definitions here... ], "publishDate": "2022-05-08T03:00:00.000Z", "examples": [ { "title": "4.1 Nursery establishment", "text": "A stolon is a stem that grows along the ground, producing at its nodes new plants with roots and upright stems.", // Additional data here... }, // More examples here... ], // Additional fields here... }

Huey İşçisini Çalıştırmak

Huey Worker'ı terminalinize aşağıdaki komutu yazarak başlatabilirsiniz:

 python manage.py run_huey


Yukarıdaki komuta, konsola neyin kaydedileceğini değiştirecek birden fazla bayrak iletebilirsiniz, örneğin:

  • -v, --verbose - ayrıntılı günlük kaydı (DEBUG düzeyini içerir)
  • -q, --quiet - minimum günlük kaydı
  • -S, --simple - basit kayıt formatı (“zaman mesajı”)


Günlüğe kaydetmeye ilişkin diğer çeşitli seçeneklere bakmak için buradaki dokümanlara göz atın.

Huey ile Başka Ne Yapabilirsiniz?

Görev Dekoratörleri

Huey, görev içinde hangi işlemleri gerçekleştirdiğinize bağlı olarak birden fazla görev dekoratörüyle birlikte gelir.


Aşağıda bunların hepsinin ne işe yaradığını kısaca anlatacağım.


İşte tüm dekoratörler için ithalat bildirimi:

 from huey.contrib.djhuey import task, periodic_task, db_task, db_periodic_task
  • task : Düzenli bir görev.
  • periodic_task : Bir görevi bir zamanlamaya göre periyodik olarak çalıştırmak istediğinizde.
  • db_task : Göreviniz dahilinde DB işlemlerini gerçekleştirmek istediğinizde.
  • db_periodic_task : Periyodik bir görevde DB işlemlerini gerçekleştirmek istediğinizde.

Crontab Örnekleri

Görevlerinizi planlamak için crontab'ı nasıl kullanabileceğinize dair size birkaç örnek daha göstereyim.

  • crontab(minute='*/3') görevi her üç dakikada bir çalışacak şekilde planlar.
  • crontab(hour='*/3', minute='5') her üç saatte bir 5 dakika sonra çalışacak bir görev oluşturur.
  • crontab(minute='00', hour='10', month='*/2', day_of_week='*/5') her 2. ayda, haftanın 5. gününde çalışacak bir görev oluşturur. 10:00.

Görevleri Planlama

Örneğin, tasks.py içinde tanımlanmış olan aşağıdaki göreve sahipsiniz:

 from huey.contrib.djhuey import task @task() def count(): for i in range(10): print(i)


Şimdi bu görevi çağırmak ancak 5 saniye sonra çalışmasını istiyorsanız aşağıdakileri yapabilirsiniz:

 count.schedule(delay=5)

delay parametresi saniye cinsinden değer alır, dolayısıyla 5 dakika sonra çalışmasını istiyorsanız 300 saniye belirtin.

Başarısız Olan Görevleri Yeniden Denemek

Mevcut görevimize aşağıdaki mantığı eklediğinizi varsayalım:

 @db_periodic_task(crontab(hour="18", minute="00"), retries=2) def fetch_daily_word(): r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}") if r.status_code != 200: raise Exception("Unable to fetch data from Wordnik API") ## Add this logic else: data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] )


Bu nedenle, yanıtın durum kodunu kontrol etme mantığını ekledik ve eğer 200'den farklı bir şeyse, o görevi 2 defaya kadar yeniden deneyecek. Ancak bu yeniden denemeler, iki deneme arasında herhangi bir zaman aralığı olmadan gerçekleşecektir. Peki ya bu görevin birden fazla denemesini ertelemek isterseniz? Bunu retry_delay argümanını ileterek yapabiliriz, değerleri saniyeler içinde kabul eder.


 @db_periodic_task(crontab(hour="18", minute="00"), retries=2, retry_delay=10)

Bu, birden fazla deneme arasında 10 saniyelik bir gecikmeye neden olur.

Geliştirme Modu

Huey, Django'da geliştirme sırasında Huey ile çalışmayı kolaylaştıran varsayılan bir ayarla birlikte gelir. Yani, settings.py dosyanızda DEBUG=True mevcut olduğunda, görevler tıpkı normal işlev çağrıları gibi eşzamanlı olarak yürütülecektir. Bunun amacı, testleri geliştirirken veya çalıştırırken hem Redis'i hem de ek bir tüketici sürecini çalıştırmaktan kaçınmaktır. Bu konuda daha fazlasını buradan okuyabilirsiniz.


Bunun için settings.py dosyasına aşağıdaki satırı eklememiz gerekiyor:

 HUEY = {}


Ancak bu davranışı geçersiz kılmak istiyorsanız bunun yerine aşağıdaki Huey yapılandırmasını ekleyebilirsiniz:

 HUEY = { "immediate": False }

settings.py dosyasında belirtilen yukarıdaki yapılandırmaya sahipseniz, DEBUG=True değerine sahipken Huey, Redis'i kurmanızı ve run_huey komutunu kullanarak Huey Worker'ı çalıştırmanızı isteyecektir.

Kereviz vs Huey

Kereviz ile karşılaştırıldığında Huey hakkında bazı gözlemler şunlardır:

  • Kereviz ile karşılaştırıldığında daha az bağımlılık alanı. Kereviz beraberinde kombu ve bilardo da kurar. Bu arada Huey'nin herhangi bir bağımlılığı yok.


  • Periyodik görevler için daha az hizmetin çalıştırılması gerekir, Kereviz, periyodik görevlerle çalışmak için beat hizmetinin ve bir çalışan hizmetinin çalıştırılmasını gerektirir, bu arada run_huey komutunu kullanarak yalnızca bir hizmeti çalıştırmamız gerekir.

Referanslar

  1. Huey Dokümanları
  2. Wordnik API'si
  3. İlgili Github Repo'su