Explorar el Código

定时删除未使用的数据

john hace 2 años
padre
commit
b3fb809802

+ 4 - 16
admin_site/admin_site/celery.py

@@ -1,22 +1,10 @@
 import os
-
 from celery import Celery
-
-# Set the default Django settings module for the 'celery' program.
+# 为“celery”程序设置默认的 Django 设置模块。
 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'admin_site.settings')
 
 app = Celery('admin_site')
-
-# Using a string here means the worker doesn't have to serialize
-# the configuration object to child processes.
-# - namespace='CELERY' means all celery-related configuration keys
-#   should have a `CELERY_` prefix.
+# 自动配置 CELERY
 app.config_from_object('django.conf:settings', namespace='CELERY')
-
-# Load task modules from all registered Django apps.
-app.autodiscover_tasks()
-
-
-@app.task(bind=True, ignore_result=True)
-def debug_task(self):
-    print(f'Request: {self.request!r}')
+# 从所有已注册的 Django 应用加载任务模块。
+app.autodiscover_tasks()

+ 13 - 9
admin_site/admin_site/settings.py

@@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/dev/ref/settings/
 """
 
 from pathlib import Path
+from celery.schedules import crontab
 
 # Build paths inside the project like this: BASE_DIR / 'subdir'.
 BASE_DIR = Path(__file__).resolve().parent.parent
@@ -44,7 +45,6 @@ INSTALLED_APPS = [
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
-
 ]
 
 MIDDLEWARE = [
@@ -140,13 +140,17 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
 # 允许全部来源
 CORS_ORIGIN_ALLOW_ALL = True  # 如果为True,将不使用白名单,并且将接受所有来源。默认为False。
 
-# Celery settings
-
+# Celery settings Start
 CELERY_BROKER_URL = 'redis://localhost:6379/1'
-# CELERY_BROKER_URL = BASE_DIR / 'mysite',  # 数据库名,先前创建的
-# 'NAME': BASE_DIR / 'mysite',  # 数据库名,先前创建的
-#: Only add pickle to this list if your broker is secured
-#: from unwanted access (see userguide/security.html)
 CELERY_ACCEPT_CONTENT = ['json']
-CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'
-CELERY_TASK_SERIALIZER = 'json'
+CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
+CELERY_TASK_SERIALIZER = 'json'
+
+CELERY_BEAT_SCHEDULE = {
+    'task-name': {
+        'task': 'files.tasks.del_file',
+        'schedule': crontab(hour='*/1'), # 每隔1小时删除用户未使用的,且上传时间大于4小时的
+        # 'args': (1, 2),
+    },
+}
+# Celery settings End

BIN
admin_site/celerybeat-schedule.db


+ 18 - 0
admin_site/files/migrations/0003_files_order_id.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.1.7 on 2023-04-09 07:02
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('files', '0002_alter_files_file_path'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='files',
+            name='order_id',
+            field=models.CharField(max_length=100, null=True),
+        ),
+    ]

+ 1 - 0
admin_site/files/models.py

@@ -9,6 +9,7 @@ from django.db import models
 class Files(models.Model):
     id = models.BigAutoField(primary_key=True)  #文件id
     user_id = models.CharField(max_length=100,null=True) # 用户ID
+    order_id = models.CharField(max_length=100,null=True) # 订单ID
     file_path = models.FileField(upload_to='download/') # 文件存放地址
     create_time = models.DateTimeField(auto_now_add=True)  # 创建时间
     update_time = models.DateTimeField(auto_now=True)  # 更新时间

+ 25 - 1
admin_site/files/tasks.py

@@ -1,6 +1,30 @@
 from celery import shared_task
-
+from .models import Files as Files_models
+from datetime import datetime, timedelta
+from django.utils import timezone
+import os
 
 @shared_task
 def add(x, y):
     return x + y
+
+# 每隔4小时,删除一份文件
+@shared_task
+def del_file():
+    # 将当前时间转换为时区感知的时间
+    now_aware = timezone.make_aware(datetime.now(), timezone.get_current_timezone())
+    # 比当前时间早4小时的时间
+    three_hours_ago = now_aware - timedelta(hours=4)
+    # 找到不存在订单id,并且上传时间比当前时间早4小时的文件数据,将其删除
+    files_to_delete = Files_models.objects.filter(order_id__isnull=True, create_time__lt=three_hours_ago)
+    # 创建一个循环语句
+    for file in files_to_delete:
+        # 获取文件的绝对路径
+        file_path = os.getcwd() + file.file_path
+        try:
+            # 删除文件
+            os.remove(file_path)
+        except OSError as e:
+            print("Error: %s : %s" % (file_path, e.strerror))
+        # 删除数据库数据
+        file.delete()

+ 1 - 2
admin_site/files/urls.py

@@ -4,9 +4,8 @@ from rest_framework import routers, serializers, viewsets
 from . import views
 
 urlpatterns = [
-    # re_path('', views.info),
-
     re_path('^info', views.info),
     re_path('^hhhh', views.test),
+    re_path('^del_file_view', views.del_file_view),
     re_path('', views.index),
 ]

+ 12 - 4
admin_site/files/views.py

@@ -1,11 +1,12 @@
 from django.views.decorators.http import require_http_methods
 from django.views.decorators.csrf import csrf_exempt
-from admin_site.utils import setError, setSuccess, userPersonToDictionary,is_token
+from admin_site.utils import setError, setSuccess, userPersonToDictionary, is_token
 from admin_site.decorator import my_decorator
 from django.contrib.auth.decorators import login_required
 import os
-from django.http import HttpResponse, Http404, StreamingHttpResponse,JsonResponse
-from .tasks import add
+from django.http import HttpResponse, Http404, StreamingHttpResponse, JsonResponse
+from .tasks import add, del_file
+
 
 @csrf_exempt
 @require_http_methods(["POST", "GET"])
@@ -37,6 +38,7 @@ def index(request):
 def info(request):
     return HttpResponse(setError("文件不存在 info"))
 
+
 @csrf_exempt
 @require_http_methods(["POST", "GET"])
 def test(request):
@@ -45,4 +47,10 @@ def test(request):
     # return HttpResponse(result.task_id)
     # return HttpResponse(setError("文件不存在 info"))
     result = add.delay(1, 2)
-    return HttpResponse(result.get())
+    return HttpResponse(result.get())
+
+@csrf_exempt
+@require_http_methods(["POST", "GET"])
+def del_file_view(request):
+    del_file()
+    return JsonResponse(setSuccess(msg='更新成功', data=True))

BIN
admin_site/mysite


+ 13 - 1
admin_site/readme.md

@@ -2,4 +2,16 @@
 python3 manage.py createsuperuser
 
 ### 创建模块
-python3 manage.py startapp
+python3 manage.py startapp
+
+
+### 启动异步任务队列
+```bash
+celery -A admin_site worker -l info
+```
+
+
+### 启动定时任务
+```bash
+celery -A admin_site beat
+```

+ 1 - 1
admin_site/user/urls.py

@@ -4,9 +4,9 @@ from rest_framework import routers, serializers, viewsets
 from . import views
 
 urlpatterns = [
-    # re_path('', views.info),
     re_path('^index', views.index),
     re_path('^login', views.login),
     re_path('^register', views.register),
     re_path('^update', views.update),
+    re_path('', views.info),
 ]