繁体   English   中英

Django views.py 代码在我重新加载服务器时自动运行

[英]Django views.py code running automatically whenever I reload the server

我有使用 Django 应用程序的 view.py 中的 upload_log 端点从 CSV 文件上传并插入 MySQL 表的日志。 我在不同的子应用程序(还有 Django)中还有另一个 views.py,它解析日志表中的现有数据并根据条件将其拆分为不同的行。

问题是每当我重新加载创建重复的服务器时都会发生解析,除了我不打算让它这样。 我需要它,以便每当上传数据(触发发布)时,它会在上传的数据上运行 function 以解析日志。

编辑(澄清):当我执行 py manage.py runserver 时它不会执行 - 但它在我运行 runserver 命令和文件内的 CTRL + S 以重新加载服务器后执行。

如果有人指导我完成此操作,我将不胜感激。

这是该任务的views.py(日志应用程序):

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)

这是从 CSV(ParsedLogs 应用程序)上传的 views.py:

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 class 在顶层有一堆不在方法内部的代码。

每当导入模块时,都会执行此代码。

如果您希望代码不自动执行,请将其放在方法中,然后根据需要调用该方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM