Код Django views.py запускается автоматически при каждой перезагрузке сервера
У меня есть журналы, которые загружаются и вставляются в таблицу MySQL из CSV файлов с помощью конечной точки upload_log в файле views.py приложения Django. У меня также есть другой views.py в другом приложении (тоже Django), который анализирует существующие данные из таблицы журналов и разбивает их на различные строки в соответствии с условиями.
Проблема в том, что парсинг происходит каждый раз, когда я перезагружаю сервер, что создает дубликаты, помимо того, что я не намерен делать это таким образом. Мне нужно сделать так, чтобы каждый раз, когда данные загружаются (пост срабатывает), запускалась функция для этих загруженных данных, чтобы разобрать логи.
Редактирование (уточнение): Не выполняется, когда я делаю py manage.py runserver - Но выполняется после того, как я выполнил команду runserver и CTRL + S внутри файла, чтобы перезагрузить сервер.
Я буду благодарен, если кто-нибудь поможет мне в этом.
Вот views.py этой задачи (приложение Logs):
from rest_framework import viewsets
from rest_framework.decorators import action
from api.packets.models import Fields
from .models import LogsParsed
from api.logs.models import Logs
from .serializers import LogsParsedSerializer
class getLogs(viewsets.ModelViewSet):
serializer_class = LogsParsedSerializer
queryset = LogsParsed.objects.all()
parsedLogs=[]
for log in Logs.objects.all():
fields = Fields.objects.filter(pac_id=log.message_id_decimal)
binaryTest=log.data_binary
for field in fields:
items=LogsParsed(
pac_id=log.message_id_decimal,
log_id=log.log_id,
log_date=log.log_date,
fld_name=field.fld_name,
value=binaryTest[field.fld_offset:field.fld_offset+field.fld_len]
)
parsedLogs.append(items)
LogsParsed.objects.bulk_create(parsedLogs)
А вот views.py выгрузки из CSV (приложение ParsedLogs):
from django.contrib import messages
from rest_framework import viewsets
from rest_framework.decorators import action
from datetime import datetime
from rest_framework.response import Response
from .models import Logs
from .serializers import LogsSerializer
import pandas as pd
class LogsViewSet(viewsets.ModelViewSet):
serializer_class = LogsSerializer
queryset = Logs.objects.all()
@action(detail=False, methods=['POST'])
def upload_log(self, request):
"""Upload data from CSV, with validation."""
if request.method == 'POST':
file = request.FILES['file']
data_file = pd.read_csv(file, sep=';', encoding="utf8")
file_name = request.FILES['file'].name
_datetime = datetime.now()
file_upload_date = _datetime.strftime("%Y_%m_%d %H:%M:%S")
# Swap every 2-character blocks with the next 2-character blocks
def swap_bits(data):
blocks = [data[i:i+4] for i in range(0, len(data), 4)]
for i in range(len(blocks)):
blocks[i] = blocks[i][2:] + blocks[i][:2]
return "".join(blocks)
# Iterating through rows
row_iter = data_file.iterrows()
logs = [
Logs(
file_upload_date=file_upload_date,
file_name=file_name,
log_date=row["Date and time[ms]"],
stamp=row[" Stamp"],
message_id=row[" Message Id"],
message_id_decimal=int(row[" Message Id"], 16),
length=row[" Length"],
data=row[" Data"],
# data_binary=swap_bits(row[" Data"])
data_binary=bin(int(swap_bits(row[" Data"]), 16))[2:]
)
for index, row in row_iter
]
Logs.objects.bulk_create(logs)
return Response({"success": "Successfully uploaded logs!"})
Как отметил @Durai, класс getLogs
имеет код на верхнем уровне, который не находится внутри метода.
Этот код будет выполняться всякий раз, когда модуль импортируется, поскольку он является частью класса definition.
Если вы хотите, чтобы код не выполнялся автоматически, поместите его внутрь метода внутри класса, а затем вызывайте метод по мере необходимости.