Python Django上载和处理文件,不保留数据

Python Django上载和处理文件,不保留数据,python,django,dropzone.js,Python,Django,Dropzone.js,Python:2.7.11 Django:1.9 我想上传一个csv文件到Django,并用Python类对其进行分析。不允许保存,文件只需要到达要分析的类。我在表单中使用Dropzone.js,但我不明白应该如何配置/编程视图来实现这一点 <form action="/upload/" method="post" enctype="multipart/form-data" class="dropzone" id="dropzone"> {% csrf_token %}

Python:2.7.11

Django:1.9

我想上传一个csv文件到Django,并用Python类对其进行分析。不允许保存,文件只需要到达要分析的类。我在表单中使用Dropzone.js,但我不明白应该如何配置/编程视图来实现这一点

<form action="/upload/" method="post" enctype="multipart/form-data" class="dropzone" id="dropzone">
    {% csrf_token %}
    <div class="fallback">
        <input name="file" type="file" multiple />
    </div>
</form>
forms.py

from django import forms
class FileUploadForm(forms.Form):
    file = forms.FileField()
关闭更新: 帮助回答和我的处境之间最重要的区别是我必须解码我的输入。 在handle_csv_数据中,将以下行作为我的csv_文件:

StringIO(content.read().decode('utf-8-sig'))

在查看功能中访问csv文件。如果您使用的是python 3,则必须将
InMemoryUploadedFile
包装在
TextIOWrapper
中,以使用
csv
模块对其进行解析

在本例中,csv被解析并作为名为“content”的列表传回,该列表将显示为一个表

视图.py

import csv
import io  # python 3 only

def handle_csv_data(csv_file):
    csv_file = io.TextIOWrapper(csv_file)  # python 3 only
    dialect = csv.Sniffer().sniff(csv_file.read(1024), delimiters=";,")
    csv_file.seek(0)
    reader = csv.reader(csv_file, dialect)
    return list(reader)


def upload_csv(request):
    csv_content=[]
    if request.method == 'POST':
        csv_file = request.FILES['file'].file
        csv_content = handle_csv_data(csv_file)  
    return render(request, 'upload.html', {'content':content})
您的原始代码没有正确使用django的表单框架,所以我从这个示例中删除了它。因此,当上传的文件无效或丢失时,您应该实现错误处理

upload.html

  <form action="/upload/" 
        method="post" 
        enctype="multipart/form-data" 
        class="dropzone" 
        id="dropzone">
    {% csrf_token %}
    <div class="fallback">
      <input name="file" type="file"/>
      <input type="submit"/>
    </div>
  </form>
  {% if content %}
  <table>
  {% for row in content %}
    <tr>
    {% for col in row %}
      <td>{{ col }}</td>
    {% endfor %}
    </tr>
  {% endfor %}
  </table>
  {% endif %}

{%csrf_令牌%}
{%if内容%}
{内容%中的行为%1}
{第%行中的列为%1}
{{col}}
{%endfor%}
{%endfor%}
{%endif%}

我添加了一个“提交”按钮,这样它就可以在没有dropzone的情况下工作。我还从文件输入中删除了“multiple”,以保持示例的简单性。最后,如果模板从已解析的csv接收内容,则有一个表。但是使用dropzone.js时,必须使用javascript回调函数来显示表。

链接中的url无效。这是文章吗@肯利德是的,对不起,就是这个。我在问题中解决了。到目前为止你都试了些什么?你能发布你的表单和查看代码吗?“不允许保存”的确切含义是什么@HåkenLid我添加了view.py。我所说的不保存是指csv文件不能保存到服务器、数据库或其他任何地方。这些文件只需要通过python类/函数进行扫描/分析。此函数用于从csv中提取所有值并对其进行分析。这意味着,除此之外,不需要该文件。谢谢您的代码。它似乎没有通过is_valid()检查。我将更新我的帖子,向您展示FileUploadForm中的内容,因为我不确定该如何处理它。谢谢,这似乎是正确的。感谢所有指点。代码现在是一团糟,但这只是因为我想让它工作,然后调整它是正确的。现在我似乎得到了以下信息:“强制使用Unicode:需要字符串或缓冲区,InMemoryUploadedFile已找到”。我可以从InMemoryUploadedFile转到buffer吗?这似乎是在读取文件,但因为我试图使用“codecs.open(location,'r',encoding=enc)as csvfile”打开它:“它给我一个错误,说明文件名太长。您可以在这里看到的位置是csv_文件。
  <form action="/upload/" 
        method="post" 
        enctype="multipart/form-data" 
        class="dropzone" 
        id="dropzone">
    {% csrf_token %}
    <div class="fallback">
      <input name="file" type="file"/>
      <input type="submit"/>
    </div>
  </form>
  {% if content %}
  <table>
  {% for row in content %}
    <tr>
    {% for col in row %}
      <td>{{ col }}</td>
    {% endfor %}
    </tr>
  {% endfor %}
  </table>
  {% endif %}