Django 上传和处理没有数据保留的文件
Django upload and process file with no data retention
Python: 2.7.11
Django: 1.9
我想上传一个 csv 文件到 Django 并用 Python class 分析它。不允许保存,文件只需要到达 class 即可进行分析。我正在使用 Dropzone.js 作为表单,但我不明白我应该如何 configure/program 视图来实现此目的。
<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>
我找到了关于此的 article 但它描述了保存并且基于 Django 1.5。
view.py
def upload(request):
if request.method == 'POST':
file = FileUploadForm(request.POST)
if file.is_valid():
return HttpResponseRedirect('/upload/')
else:
file = FileUploadForm()
return render(request, 'app/upload.html', {'file': file})
forms.py
from django import forms
class FileUploadForm(forms.Form):
file = forms.FileField()
结束更新:
帮助答案和我的情况之间最重要的区别是我必须解码我的输入。
请参阅 handle_csv_data 中的以下行作为我的 csv_file:
StringIO(content.read().decode('utf-8-sig'))
在视图函数中访问csv文件。如果您使用 python 3,则必须将 InMemoryUploadedFile
包装在 TextIOWrapper
中以使用 csv
模块对其进行解析。
在此示例中,csv 被解析并作为名为 'content' 的列表传回,该列表将显示为 table.
views.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 %}
我添加了一个 'submit' 按钮,这样就可以在没有 dropzone 的情况下工作。我还从文件输入中删除了 'multiple',以保持示例简单。如果模板从解析的 csv 中接收内容,最后会有一个 table。但是当使用dropzone.js时,你必须使用javascript回调函数来显示table。
Python: 2.7.11
Django: 1.9
我想上传一个 csv 文件到 Django 并用 Python class 分析它。不允许保存,文件只需要到达 class 即可进行分析。我正在使用 Dropzone.js 作为表单,但我不明白我应该如何 configure/program 视图来实现此目的。
<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>
我找到了关于此的 article 但它描述了保存并且基于 Django 1.5。
view.py
def upload(request):
if request.method == 'POST':
file = FileUploadForm(request.POST)
if file.is_valid():
return HttpResponseRedirect('/upload/')
else:
file = FileUploadForm()
return render(request, 'app/upload.html', {'file': file})
forms.py
from django import forms
class FileUploadForm(forms.Form):
file = forms.FileField()
结束更新: 帮助答案和我的情况之间最重要的区别是我必须解码我的输入。 请参阅 handle_csv_data 中的以下行作为我的 csv_file:
StringIO(content.read().decode('utf-8-sig'))
在视图函数中访问csv文件。如果您使用 python 3,则必须将 InMemoryUploadedFile
包装在 TextIOWrapper
中以使用 csv
模块对其进行解析。
在此示例中,csv 被解析并作为名为 'content' 的列表传回,该列表将显示为 table.
views.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 %}
我添加了一个 'submit' 按钮,这样就可以在没有 dropzone 的情况下工作。我还从文件输入中删除了 'multiple',以保持示例简单。如果模板从解析的 csv 中接收内容,最后会有一个 table。但是当使用dropzone.js时,你必须使用javascript回调函数来显示table。