Skip to content

Commit 9edc88c

Browse files
committed
celery
1 parent 5679a6c commit 9edc88c

File tree

8 files changed

+254
-2
lines changed

8 files changed

+254
-2
lines changed

.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ DATABASE_URL=sqlite:///db.sqlite3
99
#DATABASE_URL=postgres://user:[email protected]:5432/sith
1010
CACHE_URL=redis://127.0.0.1:6379/0
1111

12+
CELERY_BROKER_URL=redis://127.0.0.1:6379/1
13+
1214
MEDIA_ROOT=data
1315
STATIC_ROOT=static
1416

docs/explanation/technos.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,31 @@ de données fonctionnent avec l'un comme avec l'autre.
131131
Heureusement, et grâce à l'ORM de Django, cette
132132
double compatibilité est presque toujours possible.
133133

134+
### Celery
135+
136+
[Site officiel](https://docs.celeryq.dev/en/stable/)
137+
138+
Dans certaines situations, on veut séparer une tâche
139+
pour la faire tourner dans son coin.
140+
Deux cas qui correspondent à cette situation sont :
141+
142+
- les tâches longues à exécuter
143+
(comme l'envoi de mail ou la génération de documents),
144+
pour lesquelles on veut pouvoir dire à l'utilisateur
145+
que sa requête a été prise en compte, sans pour autant
146+
le faire trop patienter
147+
- les tâches régulières séparées du cycle requête/réponse.
148+
149+
Pour ça, nous utilisons Celery.
150+
Grâce à son intégration avec Django,
151+
il permet de mettre en place une queue de message
152+
avec assez peu complexité ajoutée.
153+
154+
En outre, ses extensions `django-celery-results`
155+
et `django-celery-beat` enrichissent son intégration
156+
avec django et offrent des moyens de manipuler certaines
157+
tâches directement dans l'interface admin de django.
158+
134159
## Frontend
135160

136161
### Jinja2

docs/tutorial/install-advanced.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,20 @@ Toutes les requêtes vers des fichiers statiques et les medias publiques
227227
seront seront servies directement par nginx.
228228
Toutes les autres requêtes seront transmises au serveur django.
229229

230+
## Celery
231+
232+
Celery ne tourne pas dans django.
233+
C'est une application à part, avec ses propres processus,
234+
qui tourne de manière indépendante et qui ne communique
235+
que par messages avec l'instance de django.
236+
237+
Pour faire tourner Celery, faites la commande suivante dans
238+
un terminal à part :
239+
240+
```bash
241+
poetry run celery -A sith worker --beat -l INFO
242+
```
243+
230244

231245
## Mettre à jour la base de données antispam
232246

pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ dependencies = [
4646
"ical<9.0.0,>=8.3.0",
4747
"redis[hiredis]<6.0.0,>=5.2.0",
4848
"environs[django]<15.0.0,>=14.1.0",
49+
"celery[redis]<6.0.0,>=5.4.0",
50+
"django-celery-results<3.0.0,>=2.5.1",
51+
"django-celery-beat<3.0.0,>=2.7.0",
4952
]
5053

5154
[project.urls]

sith/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,9 @@
1212
# OR WITHIN THE LOCAL FILE "LICENSE"
1313
#
1414
#
15+
16+
# This will make sure the app is always imported when
17+
# Django starts so that shared_task will use this app.
18+
from .celery import app as celery_app
19+
20+
__all__ = ("celery_app",)

sith/celery.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Set the default Django settings module for the 'celery' program.
2+
import os
3+
4+
from celery import Celery
5+
6+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sith.settings")
7+
8+
app = Celery("sith")
9+
10+
# Using a string here means the worker doesn't have to serialize
11+
# the configuration object to child processes.
12+
# - namespace='CELERY' means all celery-related configuration keys
13+
# should have a `CELERY_` prefix.
14+
app.config_from_object("django.conf:settings", namespace="CELERY")
15+
16+
# Load task modules from all registered Django apps.
17+
app.autodiscover_tasks()

sith/settings.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@
8888
"django_jinja",
8989
"ninja_extra",
9090
"haystack",
91+
"django_celery_results",
92+
"django_celery_beat",
9193
"captcha",
9294
"core",
9395
"club",
@@ -271,13 +273,13 @@
271273

272274
# Medias
273275
MEDIA_URL = "/data/"
274-
MEDIA_ROOT = env.path("MEDIA_ROOT", default="data")
276+
MEDIA_ROOT = env.path("MEDIA_ROOT", default=BASE_DIR / "data")
275277

276278
# Static files (CSS, JavaScript, Images)
277279
# https://docs.djangoproject.com/en/1.8/howto/static-files/
278280

279281
STATIC_URL = "/static/"
280-
STATIC_ROOT = env.path("STATIC_ROOT", default="static")
282+
STATIC_ROOT = env.path("STATIC_ROOT", default=BASE_DIR / "static")
281283

282284
# Static files finders which allow to see static folder in all apps
283285
STATICFILES_FINDERS = [
@@ -319,6 +321,14 @@
319321
EMAIL_HOST = env.str("EMAIL_HOST", default="localhost")
320322
EMAIL_PORT = env.int("EMAIL_PORT", default=25)
321323

324+
# Celery
325+
CELERY_TIMEZONE = TIME_ZONE
326+
CELERY_TASK_TRACK_STARTED = True
327+
CELERY_TASK_TIME_LIMIT = 30 * 60
328+
CElERY_BROKER_URL = env.str("CELERY_BROKER_URL", default="redis://localhost:6379/1")
329+
CELERY_RESULT_BACKEND = "django-db"
330+
CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler"
331+
322332
# Below this line, only Sith-specific variables are defined
323333

324334
SITH_URL = env.str("SITH_URL", default="127.0.0.1:8000")

0 commit comments

Comments
 (0)