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))