终于搞定了 django 的 ajax 方式上传图片

本文记录了使用 jQuery 的 AjaxFileUpload 插件在 Django 中实现 AJAX 图片上传的过程及遇到的问题。调试中遇到包括文件输入框 name 属性缺失等低级错误,并分享了解决方案。在客户端,通过动态创建 iframe 和 form 实现文件上传,而在服务器端,Django view 可通过 request.FILES.values()[0] 获取上传文件。目前尚存在的问题是多个上传表单的等待提示图标同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天终于搞定了 django 的 ajax 方式上传图片。

客户端我用的是 jQuery 的插件 AjaxFileUpload, 其原理是动态创建一个 iframe 和一个 form, 将 <input type="file" /> 控件的内容插入到 form 中,然后向那个 iframe 提交。当然这里 iframe 通过样式设置为不可见的了。

调试的过程中出现了很多低级错误,但因为 ajax 方式很难调试,花费了不少的时间才搞定,中间连 Visual Studio 2005 都用上了,用于调试 JavaScript. 下面把错误记录下来给自己以后提个醒:

1. fileElementId 注意不要在前面加上 '#', 否则会找不到控件(用 jQuery 时间久了很容易犯这个错误)。

2. <input type="file" /> 控件一定要加上 name 属性!因为这个没加表单将不会发送任何有效的文件数据。低级错误啊~

3. 其他需要在文件上传时同时发送的字段,可以考虑拼接成一个字符串,加到 url 里面用 get 的方式发送到服务器。当然,要记得字段内容用 encodeURIComponent 函数预先处理。

下面附上一点主要的客户端调用代码:
$.ajaxFileUpload
(
    {
        url:'
/ popup / note / image_upload /? +  postData,
        secureuri: 
false ,
        fileElementId: fileElementId,
        dataType: 'json',
        success: 
function  (data, status)
        {
            
if ( typeof (data.error)  !=  'undefined'){
                
if (data.error  !=  '')
                    alert(data.error);
                
else
                    alert(data.msg);
            }
        },
        error: 
function  (data, status, e)
        {
            alert(e.description);
            
for (k  in  data) alert(data[k]);
            alert(status);
        }
    }
)

有的时候文件的 name 是动态产生的,那么在服务器端, django 的 view 中,可以改用一种办法来获取上传文件的内容,而不需要知道控件的 name:
file_obj  =  request.FILES.values()[0]

而我们平常写的最多的是这样的:
file_obj  =  request.FILES.get( ' file1 ' , None)


尚待解决的问题

AjaxFileUpload 插件提供了一个简单的 ajax 等待提示功能,大致是这样的:
$(divid  +   "  .loading " ).ajaxStart(function(){
    $(this).show();
}).ajaxComplete(function(){
    $(this).hide();
});

其原理就是用一个“等待中...” 类似的 gif 动画图标,当开始请求的时候显示,请求完了隐藏掉。

但是我发现它触发 ajaxStart, ajaxComplete 事件的时候,都是用的一种全局的机制,这会导致一个奇怪的事情,就是假如页面上有多个类似的上传表单(但是其中等待提示图标的 id 不同)时,提示的图标好像会乱掉,不该显示的显示。因为对 jQuery 插件机制还不熟悉,这个问题有待研究解决。


### Python与前端开发的整合 #### 使用Flask或Django框架进行前后端分离开发 对于希望快速搭建Web应用并实现前后端分离的情况,可以考虑使用Python Web框架如Flask或者Django。这些框架提供了强大的后端支持,并且易于与其他前端库和技术栈相结合。 - Flask是一个轻量级的微框架,适合小型项目或是学习阶段的选择[^1]。 ```python from flask import Flask, render_template_string app = Flask(__name__) @app.route('/') def index(): return render_template_string('<h1>Hello World</h1>') ``` - Django则更为全面,内置了许多实用的功能模块,比如ORM、认证系统等,在大型复杂项目的构建上有优势[^2]. 为了更好地连接Python后端和JavaScript前端,通常采用RESTful API的方式来进行数据交换。这可以通过上述提到的任何一种框架来完成,也可以借助于专门用于创建高效API服务的新一代工具——FastAPI。它不仅性能优越而且语法简洁直观,非常适合用来处理JSON格式的数据请求。 #### 利用模板引擎渲染HTML页面 无论是Flask还是Django都自带了优秀的模板引擎Jinja2,允许开发者编写动态网页内容而无需手动拼接字符串。这种方式下可以直接在视图函数里传递变量给模板文件中的占位符位置,从而实现在服务器端生成完整的HTML文档再返回给浏览器显示的目的。 ```html+jinja <!-- templates/index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ title }}</title> </head> <body> <h1>Welcome to {{ name }}'s Website!</h1> <p>This is a dynamic page generated by Jinja2.</p> </body> </html> ``` #### 实现单页应用程序(SPA) 当追求极致用户体验时,则可以选择基于Vue.js/React/Angular这样的现代化前端框架打造SPA (Single Page Application),并通过AJAX异步加载所需资源而不必刷新整个页面。此时后端只需要提供必要的接口即可满足需求;而对于跨域资源共享(CORS)等问题也需要适当配置解决办法[^3]。 #### 文件上传功能的支持 考虑到实际应用场景中经常涉及到图片或其他类型的二进制资料提交操作,因此确保所选的技术方案具备良好的文件上传能力至关重要。大多数主流Web框架均对此有所准备,例如利用`multipart/form-data`编码方式配合相应的中间件就能轻松搞定这一任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值