使用Django上传文件时的无限POST请求

yrdbyhpb  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(149)

我尝试通过Django的Web界面上传一些文件到服务器。

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>

查看次数.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)

文件管理器.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)

文件管理器还使用上传的文件更新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
vngu2lb8

vngu2lb81#

根据文件:
在成功处理POST数据后,您应该总是返回一个HttpResponseRedirect。这通常是一种很好Web开发实践。
所以观点应该是这样的:

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("success")

    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)

def success(request):
    return django.shortcuts.render(request, "MediaManager/file_success.html")

也不需要在表单标记本身中给予与按钮中相同的名称,即upload_file
urls.py:

urlpatterns=[
    #...
    path("file_success/",views.success,name="success")
]
    #...

文件_成功.html:

<body>
    <h2>The file has been uploaded successfully. </h2>
    <a href="{% url 'your_media_manager_view_name' %}"> uplad page </a> 
</body>

相关问题