Как извлечь длинный блок кода представления в меньший метод?

У меня есть приложение Django. И у меня есть длинный метод, в котором пользователь может загрузить файл и содержимое файла будет показано в textarea.

По причине принципа S.O.L.I.D. Код, который отвечает за извлечение данных из файла, должен находиться в отдельном методе.

Итак, это views.py:


class ReadingFile(View):
    def get(self, request):
        form = ProfileForm()
        return render(request, "main/create_profile.html", {
            "form": form
        })
        
    def extractingtextfromimage():
        pass

    def post(self, request):
        submitted_form = ProfileForm(request.POST, request.FILES)
        content = ''

        if submitted_form.is_valid():
            uploadfile = UploadFile(image=request.FILES["upload_file"])

            name_of_file = str(request.FILES['upload_file'])
            uploadfile.save()
            print('path of the file is:::', uploadfile.image.name)            

            with open(os.path.join(settings.MEDIA_ROOT,
                                   f"{uploadfile.image}"), 'r') as f:

                print("Now its type is ", type(name_of_file))
                print(uploadfile.image.path)

                # reading PDF file
                if name_of_file.endswith('.pdf'):
                    pdfFile = wi(filename= uploadfile.image.path , resolution=300)
                    text_factuur_verdi = []

                    image = pdfFile.convert('jpeg')
                    imageBlobs = []

                    for img in image.sequence:
                        imgPage = wi(image=img)
                        imageBlobs.append(imgPage.make_blob('jpeg'))

                    for imgBlob in imageBlobs:
                        image = Image.open(io.BytesIO(imgBlob))
                        text = pytesseract.image_to_string(image, lang='eng')
                        text_factuur_verdi.append(text)

                    content = text_factuur_verdi
                    print(text_factuur_verdi)
                    
                # ENDING Reading pdf file

                else:
                    content = f.read()
                    print(content)

            return render(request, "main/create_profile.html", {
                'form': ProfileForm(),
                "content": content
            })

        return render(request, "main/create_profile.html", {
            "form": submitted_form,
        })
 


И это по поводу комментария:

reading PDF file

till: # ENDING Reading pdf file

Как выделить этот блок кода в отдельный метод?

Я действительно застрял на этой части.

Честно говоря, я не понимаю, в чем ваша проблема.

Я не могу проверить это, но я бы просто скопировал код в функцию и отправил некоторые значения в качестве параметров, и использовал return для отправки результата - так что это может быть что-то вроде этого

class ReadingFile(View):

    # ... other functions ...

    def read_pdf_file(self, uploadfile):
        
        pdfFile = wi(filename=uploadfile.image.path , resolution=300)
        text_factuur_verdi = []

        image = pdfFile.convert('jpeg')
        imageBlobs = []

        for img in image.sequence:
            imgPage = wi(image=img)
            imageBlobs.append(imgPage.make_blob('jpeg'))

        for imgBlob in imageBlobs:
            image = Image.open(io.BytesIO(imgBlob))
            text = pytesseract.image_to_string(image, lang='eng')
            text_factuur_verdi.append(text)

        content = text_factuur_verdi
        print(text_factuur_verdi)

        return content

    def post(self, request):

        # ... code ...

                # reading PDF file
                if name_of_file.endswith('.pdf'):

                    content = self.read_pdf_file(uploadfile)

                # ENDING Reading pdf file
                else:
                    content = f.read()

        # ... code ...

BTW:

Я бы сократил код до одного for цикла, и посылал бы только filename вместо uploadfile

    def read_pdf_file(self, filename):
        
        content = []

        pdf_file = wi(filename=filename, resolution=300)
        all_images = pdf_file.convert('jpeg')

        for image in all_images.sequence:
            image = wi(image=image)
            image = image.make_blob('jpeg')
            image = Image.open(io.BytesIO(image))
            
            text = pytesseract.image_to_string(image, lang='eng')
            
            content.append(text)

        #print(content)

        #content = '\n'.join(content)  # convert list to single string

        return content

    # ... later ...

    content = self.read_pdf_file(uploadfile.image.path)

А я думаю, что должно быть

if uploadfile.image.path.endswith('.pdf'):
    content = self.read_pdf_file(uploadfile.image.path)
else:
    with open(os.path.join(settings.MEDIA_ROOT, uploadfile.image.path)) as f:
         content = f.read()
Вернуться на верх