PermissionError: [WinError 32] Процесс не может получить доступ к файлу, потому что он используется другим процессом (Python/Django)

Я знаю, что этот вопрос уже задавался здесь довольно часто, однако, попробовав несколько решений, я не могу понять, как решить эту проблему.

Я загружаю изображения из Google Maps API для создания карт с маркерами и без них. Я использую django-cleanup для удаления файлов при удалении из базы данных, однако старые версии не удаляются. Странно, но django-cleanup работает правильно и удаляет связанное изображение при удалении со страницы Django Admin, но не удаляет файл напрямую, т.е. в проводнике файлов, и говорит, что он открыт в Python. Он также корректно удаляется при завершении работы моего локального сервера, как и следовало ожидать.

Отслеживание происходит следующим образом:

Traceback (most recent call last):
  File "C:\Users\Ricki.Demmery\Desktop\dev\acl_acousticapp\env\lib\site-packages\django_cleanup\handlers.py", line 97, in run_on_commit
    file_.delete(save=False)
  File "C:\Users\Ricki.Demmery\Desktop\dev\acl_acousticapp\env\lib\site-packages\django\db\models\fields\files.py", line 373, in delete
    super().delete(save)
  File "C:\Users\Ricki.Demmery\Desktop\dev\acl_acousticapp\env\lib\site-packages\django\db\models\fields\files.py", line 105, in delete
    self.storage.delete(self.name)
  File "C:\Users\Ricki.Demmery\Desktop\dev\acl_acousticapp\env\lib\site-packages\django\core\files\storage.py", line 304, in delete
    os.remove(name)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\Ricki.Demmery\\Desktop\\dev\\acl_acousticapp\\src\\acl_ac
ousticapp\\media\\projects\\9335\\gmaps_markers_5xDqMnc.png'

Вызов в файле views.py выглядит следующим образом:

gmaps = GoogleMapsAPI()
gmaps.location_img(prjID)

Мой класс Google Maps

Оказалось, что это было относительно простое исправление с помощью tempfile. Обратите внимание, файлы удаляются автоматически при удалении объекта модели через Django-cleanup. Исправление ниже

    import tempfile
    img_path = "{}/{}".format(settings.MEDIA_ROOT,"projects")
    temp_file_name = "gmaps.png"
    temp_file_markers_name = "gmaps_markers.png"
    temp_file = "{}/{}/{}".format(img_path,proj_id,
                                    temp_file_name)
    temp_file_markers = "{}/{}/{}".format(img_path,proj_id,
                                    temp_file_markers_name)

    proj_obj = Project.objects.get(project_ID=proj_id)
    report_obj = ReportDetail.objects.get(project_ID=proj_obj)

    if os.path.exists(temp_file):
        report_obj.site_location.delete()
    if os.path.exists(temp_file_markers):
        report_obj.monitoring_locations.delete()

    with tempfile.NamedTemporaryFile() as tf:
        tf.write(response.content)
        report_obj.site_location.save(temp_file_name,File(tf))
    with tempfile.NamedTemporaryFile() as tf:
        tf.write(response2.content)
        report_obj.monitoring_locations.save(temp_file_markers_name,
                                               File(tf))
Вернуться на верх