Django 1.1.1 阻塞 multipart/form-data

Posted

技术标签:

【中文标题】Django 1.1.1 阻塞 multipart/form-data【英文标题】:Django 1.1.1 chokes on multipart/form-data 【发布时间】:2011-01-21 10:18:29 【问题描述】:

最初的故事

我正在尝试使用简单的表单实现文件上传(我正在粘贴剥离版本,但包含所有重要部分):

  <form method="POST" action="" enctype="multipart/form-data">
      <input type="file" name="up_file" size="50">
      <input type="hidden" name="cpk" value="c.pk">
      <input type="submit" name="btn_submit">
  </form>

现在,在 wsgi 下运行的服务器端脚本正在接收 “cpk”字段的奇怪值,request.FILES 为空 为空 request.FILESrequest .POST 字典,所以我决定切换到开发服务器进行调试。

令人惊讶的是,ipdb 调试器在输入 request.POSTrequest.FILES 并按回车键后挂起...另一方面,当我删除 enctype ="multipart/form-data" 来自标签,我可以同时检查 request.POSTrequest.FILES,但当然是 request.FILES 是空的。

(另外 wsgi 版本似乎可以通过删除 enctype="multipart/form-data"...)

更新

我尝试了 Opera 10//Firefox 3.5、enctype="multipart/form-data"//no multipart/form-data 和 dev server//mod_wsgi 的所有组合。 结果是 enctype="multipart/form-data" 打破了表演。所以现在我要检查 Django bugtracker 是否是一个已知问题。

与此同时,也许这里有人可以为我指明正确的方向

【问题讨论】:

【参考方案1】:

您可能需要提供您的视图和表单代码,因为我们在 Django 1.1.1 中使用带有 enctype="multipart/form-data" 的表单上传非常成功。

例如,以下虚拟应用程序可以在开发服务器中完美运行。

views.py

from django import forms
from django.shortcuts import render_to_response

class UploadForm(forms.Form):
    cpk = forms.CharField(max_length=256)
    f = forms.FileField()

def my_upload_view(request):
    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            print "Got cpk",form.cleaned_data['cpk']
            print "Got file",request.FILES['f'].read()
    else:
        form = UploadForm()
    return render_to_response('upload.html', 'form':form)

上传.html

<html>
<body>
    <form enctype="multipart/form-data" method="post">
         form.f 
         form.cpk 
        <input type="submit" />
    </form>
</body>
</html>

我正在使用 django 表单实例来呈现文件输入,但它呈现的是非常常见的&lt;input type="file" name="f" id="id_f" /&gt;

使用此示例,我将文件的内容(我使用简单的文本文件进行了测试)从我的开发服务器打印到终端。我可以推荐的几个问题和测试是:

确保您上传的文件小于settings.FILE_UPLOAD_MAX_MEMORY_SIZE(默认为2.5 MB) 仔细检查您是否没有定义任何可能会破坏上传过程的自定义文件上传处理程序 (settings.FILE_UPLOAD_HANDLERS) 尝试上传一个非常简单的文件(如一个小文本文件),看看问题是否仍然存在于一些基本的问题中 使用工具检查原始 HTTP 请求/响应流量(firebug 会为您执行此操作,并且有一些独立的应用程序也将充当代理来帮助您)...有时解决方案会当您看到原始流量时跳出来。

如果您还没有找到它们,django file upload docs 有很多示例。

【讨论】:

我刚刚尝试过你的虚拟应用程序 - 如果粘贴到我的项目中,它会卡住,但如果作为独立项目运行,它可以完美运行!这解释了所有这些异常,我什至没有怀疑我可能会在某些时候破坏 Django 请求处理。谢谢!

以上是关于Django 1.1.1 阻塞 multipart/form-data的主要内容,如果未能解决你的问题,请参考以下文章

如何替换阻塞代码以在 Kotlin 中读取字节

HttpClient--Multipart Request

django中处理文件上传文件

非阻塞django? [关闭]

Django学习总结(Week01-结)

Django处理文件上传File Uploads