Automatiseer taken met Django Celery
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
tags
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.