slogan3

description

Met deze prompt krijg je gericht advies over het opzetten van Celery binnen Django, waardoor je achtergrondtaken betrouwbaar en schaalbaar kunt uitvoeren. Dit verbetert de gebruikerservaring en de performance van je applicatie aanzienlijk, zonder dat je zelf diep hoeft te duiken in complexe asynchrone programmering.

prompt

Help mij met het integreren en configureren van Celery in mijn Django-project voor het uitvoeren van asynchrone en periodieke taken. Beschrijf mijn hui ...

try_prompt

generate_helper
disclaimerOnPageApi

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een stapsgewijze handleiding om Celery te integreren en te configureren in jouw Django 3.2-project voor het uitvoeren van asynchrone en periodieke taken, inclusief het automatisch versturen van e-mails bij gebruikersregistratie en wachtwoordreset. 1. Installeer de benodigde packages Voer deze commando’s uit in je terminal: ```bash pip install celery redis django-celery-beat ``` *Opmerking:* Voor de broker kun je Redis gebruiken. Als Redis nog niet geïnstalleerd is, installeer het via je pakketbeheerder of gebruik een andere broker zoals RabbitMQ. 2. Configureer Celery in je Django-project Maak een nieuw bestand `celery.py` in je hoofdprojectmap (naast `settings.py`): ```python # myproject/celery.py from __future__ import absolute_import, unicode_literals import os from celery import Celery # Stel de Django instellingen module in os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') app = Celery('myproject') # Gebruik een string als broker URL, bijvoorbeeld Redis app.config_from_object('django.conf:settings', namespace='CELERY') # Autodiscover taken in alle apps app.autodiscover_tasks() # Optioneel: configureer Celery met timezone app.conf.enable_utc = False app.conf.timezone = 'Europe/Amsterdam' # Voor het gebruik van redis als broker # Voeg deze toe aan je settings.py: # CELERY_BROKER_URL = 'redis://localhost:6379/0' # CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' ``` 3. Pas je `__init__.py` aan In je hoofdprojectmap (`myproject/__init__.py`) voeg je toe: ```python from __future__ import absolute_import, unicode_literals # Dit zorgt dat Celery automatisch wordt geladen bij Django # en voorkomt dat Celery 'app' niet wordt gevonden from .celery import app as celery_app __all__ = ('celery_app',) ``` 4. Configureer je `settings.py` Voeg de volgende regels toe: ```python CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' CELERY_ACCEPT_CONTENT = ['json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_TIMEZONE = 'Europe/Amsterdam' ``` 5. Maak taken aan in je apps Voor je specifieke taken, zoals e-mail versturen, maak je een `tasks.py` in je app-folder: ```python # mijnapp/tasks.py from celery import shared_task from django.core.mail import send_mail from django.contrib.auth.models import User @shared_task def verstuur_email_bij_registratie(user_id): user = User.objects.get(id=user_id) send_mail( 'Welkom bij onze site', 'Bedankt voor je registratie!', 'from@example.com', [user.email], fail_silently=False, ) @shared_task def verstuur_wachtwoord_reset_email(user_email, reset_link): send_mail( 'Wachtwoord reset', f'Klik op de volgende link om je wachtwoord te resetten: {reset_link}', 'from@example.com', [user_email], fail_silently=False, ) ``` 6. Automatisering van taken Voor het automatisch versturen bij registratie en wachtwoordreset, kun je signalen gebruiken: ```python # mijnapp/signals.py from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver from .tasks import verstuur_email_bij_registratie @receiver(post_save, sender=User) def user_created(sender, instance, created, **kwargs): if created: verstuur_email_bij_registratie.delay(instance.id) ``` Vergeet niet om je signalen te registreren, bijvoorbeeld in `apps.py`: ```python # mijnapp/apps.py from django.apps import AppConfig class MijnappConfig(AppConfig): name = 'mijnapp' def ready(self): import mijnapp.signals ``` 7. Periodieke taken instellen Gebruik `django-celery-beat` om taken periodiek te plannen. Voeg toe aan `settings.py`: ```python INSTALLED_APPS += [ 'django_celery_beat', ] ``` Voer de migraties uit: ```bash python manage.py migrate django_celery_beat ``` Maak een periodic task via code of admin interface. Bijvoorbeeld in een `tasks.py`: ```python from celery import shared_task @shared_task def periodieke_task(): # bijvoorbeeld, verstuur wekelijkse samenvatting pass ``` En plan deze via admin of via code: ```python from django_celery_beat.models import PeriodicTask, IntervalSchedule # Maak een interval schema aan (bijv. elke dag) schedule, created = IntervalSchedule.objects.get_or_create( every=1, period=IntervalSchedule.DAYS, ) # Maak een periodic task PeriodicTask.objects.create( interval=schedule, name='Dagelijkse samenvatting versturen', task='mijnapp.tasks.periodieke_task', ) ``` 8. Start de Celery worker en beat In je terminal: ```bash celery -A myproject worker --beat --scheduler django_celery_beat.schedulers:DatabaseScheduler ``` **Samenvatting:** - Installeer en configureer Celery met Redis. - Maak taken klaar voor e-mail en andere automatiseringen. - Gebruik signalen of andere triggers voor automatische acties. - Gebruik django-celery-beat voor periodieke taken. - Start Celery worker met beat voor periodieke taken. Met deze setup kun je nu asynchrone taken uitvoeren en periodiek jouw automatiseringen beheren. Indien je verdere hulp nodig hebt of specifieke voorbeelden, hoor ik het graag!
provider: deepseek
model: deepseek-chat
Ik help je graag met het integreren van Celery in je Django-project. Hier is een stapsgewijze handleiding: ## 1. Installatie van benodigde packages ```bash pip install celery django-celery-beat django-celery-results redis ``` ## 2. Configuratie in settings.py Voeg toe aan je `INSTALLED_APPS`: ```python INSTALLED_APPS = [ # ... bestaande apps 'django_celery_beat', 'django_celery_results', 'celery', ] ``` Voeg deze configuratie toe: ```python # Celery Configuration CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'django-db' CELERY_ACCEPT_CONTENT = ['json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_TIMEZONE = 'Europe/Amsterdam' CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' ``` ## 3. Celery setup in je project Maak een bestand `celery.py` in je project directory (naast settings.py): ```python import os from celery import Celery from django.conf import settings os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jouw_project.settings') app = Celery('jouw_project') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() ``` Update `__init__.py` in je project directory: ```python from .celery import app as celery_app __all__ = ('celery_app',) ``` ## 4. Aanmaken van tasks Maak een bestand `tasks.py` in je app directory: ```python from celery import shared_task from django.core.mail import send_mail from django.conf import settings from django.contrib.auth.models import User from django.template.loader import render_to_string @shared_task def send_registration_email(user_id): try: user = User.objects.get(id=user_id) subject = 'Welkom bij onze applicatie!' message = render_to_string('emails/welcome_email.html', { 'user': user }) send_mail( subject, message, settings.DEFAULT_FROM_EMAIL, [user.email], fail_silently=False, ) except User.DoesNotExist: pass @shared_task def send_password_reset_email(user_id, reset_token): try: user = User.objects.get(id=user_id) subject = 'Wachtwoord reset aanvraag' message = render_to_string('emails/password_reset.html', { 'user': user, 'reset_token': reset_token }) send_mail( subject, message, settings.DEFAULT_FROM_EMAIL, [user.email], fail_silently=False, ) except User.DoesNotExist: pass ``` ## 5. Gebruik in je views ```python from .tasks import send_registration_email, send_password_reset_email # Bij registratie def register_user(request): # ... registratie logica send_registration_email.delay(user.id) # Bij wachtwoord reset def reset_password(request): # ... reset logica send_password_reset_email.delay(user.id, reset_token) ``` ## 6. Periodieke taken configureren Maak een bestand `celery_beat.py` of voeg toe aan settings.py: ```python from celery.schedules import crontab CELERY_BEAT_SCHEDULE = { 'check-pending-emails-every-hour': { 'task': 'yourapp.tasks.check_pending_emails', 'schedule': crontab(minute=0, hour='*/1'), }, } ``` ## 7. Starten van Celery workers ```bash # Start Celery worker celery -A jouw_project worker --loglevel=info # Start Celery beat voor periodieke taken celery -A jouw_project beat --loglevel=info ``` ## 8. E-mail templates Maak templates in `templates/emails/`: **welcome_email.html:** ```html <h2>Welkom {{ user.username }}!</h2> <p>Bedankt voor je registratie bij onze applicatie.</p> ``` **password_reset.html:** ```html <h2>Wachtwoord reset</h2> <p>Klik op deze link om je wachtwoord te resetten: {{ reset_link }}</p> ``` ## 9. E-mail configuratie in settings.py ```python EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = 'jouw-email@gmail.com' EMAIL_HOST_PASSWORD = 'jouw-app-password' DEFAULT_FROM_EMAIL = 'jouw-email@gmail.com' ``` ## 10. Database migraties uitvoeren ```bash python manage.py migrate django_celery_beat python manage.py migrate django_celery_results ``` Let op: Voor productie gebruik raad ik aan om SQLite te vervangen door PostgreSQL en Redis te installeren als message broker.