Бесконечный POST-запрос при загрузке файла с помощью Django
Я пытаюсь загрузить несколько файлов на сервер через веб-интерфейс с помощью Django.
HTML :
<form method="post" enctype="multipart/form-data" name="upload_file">
{% csrf_token %}
<input type="file" name="uploaded_file_list" multiple>
<button class="rounded-full bg-violet-200 text-violet-700 block p-2" name="upload_file" value="dummy" type="submit">Ajouter des fichiers</button>
</form>
views.py
def media_manager(request):
file_manager = MediaManager.server.FileManager(django.conf.settings.USER_FILE_ROOT)
# POST utilisé pour associer les tags aux images
if request.method == "POST":
print(request.POST)
if request.POST.get("upload_file"):
for uploaded_file in request.FILES.getlist("uploaded_file_list"):
file_manager.add_file(uploaded_file)
context_dict = {}
context_dict["filtered_file_list"] = MediaManager.filters.ImageFilter(request.GET, queryset=MediaManager.models.UserImage.objects.all())
return django.shortcuts.render(request, "MediaManager/media_manager.html", context=context_dict)
FileManager.py
def add_file(self, uploaded_file):
file_system_storage = django.core.files.storage.FileSystemStorage(location=self._user_dir_absolute_path)
file_system_storage.save(uploaded_file.name, uploaded_file)
FileManager также обновляет context_dict["filtered_dile_list"] с загруженными файлами.
Когда я загружаю файл в браузере, файл корректно загружается и веб-дисплей также корректно добавляет его на страницу. Я вижу POST-запрос на загрузку.
Но эта операция повторяется бесконечно.
Вот лог (с печатью request.POST) :
<QueryDict: {'csrfmiddlewaretoken': ['vCHAoeGg3QVIZDuHAls8lmV7Y8MXHqxGeWQj16N2zJcCUfoML4pVcnsmJGk7R5Er'], 'upload_file': ['dummy']}>
[02/Nov/2022 22:03:23] "POST /media_manager/ HTTP/1.1" 200 19214
1 static file copied to '/home/gautitho/workspace/MonPetitNuage/MonPetitNuage/static', 185 unmodified.
<QueryDict: {'csrfmiddlewaretoken': ['vCHAoeGg3QVIZDuHAls8lmV7Y8MXHqxGeWQj16N2zJcCUfoML4pVcnsmJGk7R5Er'], 'upload_file': ['dummy']}>
[02/Nov/2022 22:03:24] "POST /media_manager/ HTTP/1.1" 200 19580
[02/Nov/2022 22:03:24] "GET /static/MediaManager/user/Couleurs-logo-Overwatch.jpg HTTP/1.1" 200 63919
1 static file copied to '/home/gautitho/workspace/MonPetitNuage/MonPetitNuage/static', 186 unmodified.
<QueryDict: {'csrfmiddlewaretoken': ['vCHAoeGg3QVIZDuHAls8lmV7Y8MXHqxGeWQj16N2zJcCUfoML4pVcnsmJGk7R5Er'], 'upload_file': ['dummy']}>
[02/Nov/2022 22:03:25] "POST /media_manager/ HTTP/1.1" 200 19959
[02/Nov/2022 22:03:25] "GET /static/MediaManager/user/Couleurs-logo-Overwatch.jpg HTTP/1.1" 304 0
[02/Nov/2022 22:03:25] "GET /static/MediaManager/user/Couleurs-logo-Overwatch_tuThoGu.jpg HTTP/1.1" 200 63919
1 static file copied to '/home/gautitho/workspace/MonPetitNuage/MonPetitNuage/static', 187 unmodified.
<QueryDict: {'csrfmiddlewaretoken': ['vCHAoeGg3QVIZDuHAls8lmV7Y8MXHqxGeWQj16N2zJcCUfoML4pVcnsmJGk7R5Er'], 'upload_file': ['dummy']}>
[02/Nov/2022 22:03:26] "POST /media_manager/ HTTP/1.1" 200 20338
[02/Nov/2022 22:03:26] "GET /static/MediaManager/user/Couleurs-logo-Overwatch_tuThoGu.jpg HTTP/1.1" 304 0
[02/Nov/2022 22:03:26] "GET /static/MediaManager/user/Couleurs-logo-Overwatch.jpg HTTP/1.1" 304 0
[02/Nov/2022 22:03:26] "GET /static/MediaManager/user/Couleurs-logo-Overwatch_2i1PCzd.jpg HTTP/1.1" 200 63919
Согласно документации:
вы всегда должны возвращать HttpResponseRedirect после успешной работы с данными POST. Этот совет не относится к Django; это хорошая практика веб-разработки в целом.
.
Таким образом, вид должен быть следующим:
def media_manager(request):
file_manager = MediaManager.server.FileManager(django.conf.settings.USER_FILE_ROOT)
# POST utilisé pour associer les tags aux images
if request.method == "POST":
print(request.POST)
if request.POST.get("upload_file"):
for uploaded_file in request.FILES.getlist("uploaded_file_list"):
file_manager.add_file(uploaded_file)
return redirect("some_success_path_name")
context_dict = {}
context_dict["filtered_file_list"] = MediaManager.filters.ImageFilter(request.GET, queryset=MediaManager.models.UserImage.objects.all())
return django.shortcuts.render(request, "MediaManager/media_manager.html", context=context_dict)
Также не нужно давать то же имя в самом теге формы, что и в кнопке, которая является upload_file
удалите это.