Как извлечь длинный блок кода представления в меньший метод?
У меня есть приложение 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()