diff --git a/docker-compose.yml b/docker-compose.yml index ee9e095..5a0254e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,9 +17,11 @@ x-frontend-variables: &frontend-variables DOMAIN: "${DOMAIN}" REACT_APP_DOMAIN_URL: "https://${DOMAIN}/" + x-martin-variables: &martin-variables MARTIN_PORT: "${MARTIN_PORT}" + services: django: container_name: ${CONTAINERS_NAME}_django @@ -44,7 +46,35 @@ services: restart: always depends_on: - db + loyalty-rabbit: + image: rabbitmq:3.9-management + container_name: loyalty-rabbit + volumes: + - rabbitmq_data:/var/lib/rabbitmq + - rabbitmq_log:/var/log/rabbitmq + logging: + driver: none + restart: always + ports: + - 5672:5672 + beat: + restart: always + build: + context: . + entrypoint: [ "celery", "-A", "postamates.celery:app", "beat" ] + worker: + restart: always + environment: + <<: *postgres-variables + <<: *django-variables + build: + context: . + entrypoint: [ "celery", "-A", "postamates.celery:app", "worker" ] + depends_on: + - db + - loyalty-rabbit + - django db: container_name: ${CONTAINERS_NAME}_db image: mdillon/postgis diff --git a/postamates/__init__.py b/postamates/__init__.py index e69de29..9e0d95f 100644 --- a/postamates/__init__.py +++ b/postamates/__init__.py @@ -0,0 +1,3 @@ +from .celery import app as celery_app + +__all__ = ('celery_app',) \ No newline at end of file diff --git a/postamates/celery.py b/postamates/celery.py new file mode 100644 index 0000000..d6fa249 --- /dev/null +++ b/postamates/celery.py @@ -0,0 +1,24 @@ +import os + +from celery import Celery + +from postamates.settings import CELERY_BROKER_URL + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'postamates.settings') + +app = Celery('postamates', broker=CELERY_BROKER_URL, + include=["service.tasks"], ) + +app.config_from_object('django.conf:settings', namespace='CELERY') + +app.autodiscover_tasks() + +# заносим таски в очередь +# app.conf.beat_schedule = { +# 'every': { +# 'task': 'service.tasks.raschet', +# 'schedule': crontab(),#периодичность (По дефолту каждую минуту) +# 'args':[5] +# }, +# +# } diff --git a/postamates/settings.py b/postamates/settings.py index 5db38b0..0d41044 100644 --- a/postamates/settings.py +++ b/postamates/settings.py @@ -9,6 +9,7 @@ https://docs.djangoproject.com/en/3.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/3.2/ref/settings/ """ + import os from pathlib import Path @@ -42,6 +43,7 @@ INSTALLED_APPS = [ 'django_json_widget', 'django.contrib.gis', 'rest_registration', + 'django_celery_beat', ] MIDDLEWARE = [ @@ -162,3 +164,6 @@ REST_REGISTRATION = { 'VERIFICATION_FROM_EMAIL': 'noreply@spatiality.website', } SRID = 4326 + +# celery +CELERY_BROKER_URL = "amqp://loyalty-rabbit" diff --git a/postamates/urls.py b/postamates/urls.py index b3744e7..9d3bf73 100644 --- a/postamates/urls.py +++ b/postamates/urls.py @@ -1,8 +1,7 @@ +from django.conf import settings +from django.conf.urls.static import static from django.contrib import admin from django.urls import path, include -from django.conf.urls.static import static -from django.conf import settings - urlpatterns = [ path('admin/', admin.site.urls), diff --git a/requirements.txt b/requirements.txt index 8c3c1b2..5e9a55a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,18 +1,25 @@ +amqp==5.1.1 asgiref==3.6.0 attrs==22.2.0 +billiard==3.6.4.0 catboost==1.1.1 +celery==5.2.7 certifi==2022.12.7 charset-normalizer==3.0.1 click==8.1.3 +click-didyoumean==0.3.0 click-plugins==1.1.1 +click-repl==0.2.0 cligj==0.7.2 coreapi==2.3.3 coreschema==0.0.4 cycler==0.11.0 Django==3.2 +django-celery-beat==2.4.0 django-cors-headers==3.12.0 django-json-widget==1.1.1 django-rest-registration==0.7.3 +django-timezone-field==5.0 djangorestframework==3.11.1 drf-yasg==1.21.5 et-xmlfile==1.1.0 @@ -29,6 +36,7 @@ inflection==0.5.1 itypes==1.2.0 Jinja2==3.1.2 kiwisolver==1.4.4 +kombu==5.2.4 MarkupSafe==2.1.2 matplotlib==3.5.2 munch==2.5.0 @@ -38,12 +46,14 @@ packaging==23.0 pandas==1.4.2 Pillow==9.4.0 plotly==5.13.0 +prompt-toolkit==3.0.37 pre-commit psycopg2-binary==2.9.3 pygeos==0.14 pyparsing==3.0.9 pyproj==3.4.1 pyshp==2.3.0 +python-crontab==2.7.1 python-dateutil==2.8.2 pytz==2022.7.1 requests==2.28.2 @@ -57,7 +67,11 @@ sqlparse==0.4.3 tenacity==8.2.1 tqdm==4.64.0 typing_extensions==4.5.0 +tzdata==2022.7 uritemplate==4.1.1 urllib3==1.26.14 +vine==5.0.0 +wcwidth==0.2.6 xlrd==1.2.0 XlsxWriter==3.0.8 + diff --git a/service/__init__.py b/service/__init__.py index e69de29..007bf5d 100644 --- a/service/__init__.py +++ b/service/__init__.py @@ -0,0 +1,3 @@ +from postamates.celery import app as celery_app + +__all__ = ['celery_app'] diff --git a/service/tasks.py b/service/tasks.py new file mode 100644 index 0000000..860ed45 --- /dev/null +++ b/service/tasks.py @@ -0,0 +1,15 @@ +import time + +from celery import shared_task + + +# Запустить worker +# celery -A postamates worker -l info +# Запустить scheduler +# celery -A postamates beat -l INFO. + +@shared_task() +def raschet(sec: int): + print('Hello. Celery task is running...') + time.sleep(sec) + print('Finish') diff --git a/service/views.py b/service/views.py index 7d5d2b4..2f2539c 100644 --- a/service/views.py +++ b/service/views.py @@ -17,6 +17,7 @@ from service import models from service import pagination from service import serializers from service import utils +from service.tasks import raschet from service.permissions import UserPermission from service.service import PointService from service.utils import load_data @@ -186,6 +187,11 @@ class PlacementPointViewSet(ReadOnlyModelViewSet): pred = PointService.get_first_10_k() return Response({'prediction_current': pred}, status=http_status.HTTP_200_OK) + @action(detail=False, methods=['get']) + def start(self, request): + raschet.delay(5) + return Response('Sucess', 200) + class refresh_placement_points(APIView): @staticmethod