You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django静态加载GIF不显示及ConnectionResetError问题求助

解决加载GIF不显示及ConnectionResetError问题

看起来你遇到了两个关联的问题:加载GIF无法正常显示,以及服务器端抛出的连接重置错误。咱们一步步来解决它们:

一、修复加载GIF不显示的问题

1. 先确认静态URL是否正确渲染

打开浏览器开发者工具(按F12),查看页面源码里ShowLoading函数中的img.src值。Django的{% static %}标签应该被渲染成实际的静态文件路径(比如/static/img/loading.gif)。如果显示的还是模板标签本身,那说明标签没被解析——不过你提到脚本和表单位于同一HTML文件且已加载{% load static %},这种情况概率很低,但还是先确认一下。

2. 调整元素创建逻辑

你当前的代码先设置div.innerHTML = "Processing...",再追加img元素,可能导致GIF的显示被干扰,或者样式上出现问题。另外,给元素补充基础样式能让加载状态更清晰:

function ShowLoading() {
    var div = document.createElement('div');
    // 创建文本节点替代innerHTML,避免潜在解析问题
    var textNode = document.createTextNode("Processing...");
    var img = document.createElement('img');
    img.src = "{% static 'img/loading.gif' %}";
    // 给GIF添加样式,确保它能正常展示
    img.style.cssText = 'display: block; margin: 10px auto; width: 50px; height: 50px;';
    // 优化加载容器样式,提升可读性
    div.style.cssText = `
        position: fixed; 
        top: 10%; 
        left: 50%; 
        transform: translateX(-50%); /* 更精准的居中方式 */
        z-index: 5000; 
        width: 422px; 
        text-align: center; 
        background: #106087; 
        border: 1px solid #000;
        color: white;
        padding: 20px;
    `;
    // 按顺序添加文本和GIF
    div.appendChild(textNode);
    div.appendChild(img);
    document.body.appendChild(div);
    return div; // 返回容器,方便后续移除
}

调整后,GIF应该能正常显示在提示文本下方。

二、解决ConnectionResetError问题

这个错误的根源是传统表单提交会立即刷新页面,浏览器在服务器还没处理完请求时就关闭了连接,导致服务器抛出ConnectionResetError。要解决这个问题,我们需要用AJAX提交表单,让页面保持加载状态直到处理完成:

1. 修改表单和提交逻辑

先给表单加一个ID,方便监听提交事件:

<form id="image-upload-form" method="post" enctype="multipart/form-data">
    <!-- 你的表单内容 -->
    <button type="submit">Submit</button>
</form>

然后替换原来的onsubmit绑定,改用AJAX提交:

// 监听表单提交事件
document.getElementById('image-upload-form').addEventListener('submit', function(e) {
    e.preventDefault(); // 阻止默认的页面刷新行为
    var loadingDiv = ShowLoading(); // 显示加载动画
    
    // 构建表单数据
    var formData = new FormData(this);
    
    // 发送AJAX请求
    fetch(this.action, {
        method: this.method,
        body: formData,
        headers: {
            'X-CSRFToken': '{{ csrf_token }}' // 别忘了Django的CSRF令牌
        }
    })
    .then(response => {
        if (response.ok) {
            return response.json(); // 假设后端返回JSON,可根据实际调整
        }
        throw new Error('处理失败,请重试');
    })
    .then(data => {
        // 处理完成后移除加载动画,切换视图
        document.body.removeChild(loadingDiv);
        // 跳转到结果页面,替换成你的实际URL
        window.location.href = '/your-result-url/';
    })
    .catch(error => {
        // 处理错误
        document.body.removeChild(loadingDiv);
        alert(error.message);
    });
});

2. 后端视图调整

确保你的Django视图处理完图片后,返回一个JSON响应(比如包含结果页面的URL),而不是直接重定向:

from django.http import JsonResponse

def image_processing_view(request):
    if request.method == 'POST':
        # 图片处理逻辑
        # ...
        # 返回处理结果
        return JsonResponse({'success': True, 'redirect_url': '/result/'})

这样修改后,表单提交不会刷新页面,加载动画会一直显示到处理完成,服务器也不会再出现连接重置的错误。

内容的提问来源于stack exchange,提问作者raul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:06:16