我目前的工作项目要求我允许用户上传各种格式的文件(目前只处理 CSV 格式),然后使用包含的数据使用 Pandas 绘制图表。图书馆。
我已经决定,将图形呈现到模板的最简单方法是为图形创建一个特定 View ,然后将图像从所需模板(例如包含文件上传的表单页面)链接到该 View .我可以处理具有我硬编码的本地路径的文件,但我似乎无法将上传的文件传递到图形 View 。我读过使用 session 是最简单的方法,但我的尝试没有成功。
以下代码是我的文件上传表单 View ,它给出了以下错误:
错误#1
InMemoryUploadedFile: sampleCSV.csv (application/vnd.ms-excel) is not JSON serializable
# upload files
@login_required
def list(request):
# handle file upload
if request.method == 'POST':
form = FileUploadForm(request.POST, request.FILES)
if form.is_valid():
newdoc = FileUpload(docFile = request.FILES['docFile'])
newdoc.save();
request.session['docFile'] = request.FILES['docFile']
return HttpResponseRedirect(reverse('list'))
else:
form = FileUploadForm()
# render list page
return render_to_response(
'graphite/list.html',
{ 'form': form },
context_instance=RequestContext(request)
)
下面显示的图 TableView 引发以下错误:
错误#2
Expected file path name or file-like object, got class 'NoneType' type
# graph input file
def graph(request):
new_file = request.session.get('docFile')
fig = Figure()
ax = fig.add_subplot(111)
data_df = pd.read_csv(new_file)
data_df = pd.DataFrame(data_df)
data_df.plot(ax=ax)
canvas = FigureCanvas(fig)
response = HttpResponse( content_type = 'image/png')
canvas.print_png(response)
return response
任何关于我明显做错了什么或我可以做些什么的想法将不胜感激。谢谢。
编辑
根据建议,我尝试存储文件名,然后通过 session 传递它,但也无济于事。当前错误与上面第二个列出的错误相同。我的实现如下:
模型.py
class FileUpload(models.Model):
docFile = models.FileField(upload_to='Data_Files', blank=True)
@property
def filename(self):
return os.path.basename(self.docFile.name)
文件上传 View
# upload files
@login_required
def list(request):
# handle file upload
if request.method == 'POST':
form = FileUploadForm(request.POST, request.FILES)
if form.is_valid():
newdoc = FileUpload(docFile = request.FILES['docFile'])
newdoc.save();
request.session['docFile'] = newdoc.filename
return HttpResponseRedirect(reverse('list'))
else:
form = FileUploadForm()
# render list page
return render_to_response(
'graphite/list.html',
{ 'form': form },
context_instance=RequestContext(request)
)
图 TableView
# graph input file
def graph(request):
new_file = request.session.get('docFile')
fig = Figure()
ax = fig.add_subplot(111)
data_df = pd.DataFrame.from_csv(new_file)
data_df.plot(ax=ax)
canvas = FigureCanvas(fig)
response = HttpResponse( content_type = 'image/png')
canvas.print_png(response)
return response
上述错误的回溯:
Traceback:
File "C:\Python34\lib\site-packages\django-1.7.1-py3.4.egg\django\core\handlers\base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\vut46744\Desktop\graphite_project\graphite\views.py" in graph
127. data_df = pd.DataFrame.from_csv(new_file)
File "C:\Python34\lib\site-packages\pandas\core\frame.py" in from_csv
1027. infer_datetime_format=infer_datetime_format)
File "C:\Python34\lib\site-packages\pandas\io\parsers.py" in parser_f
465. return _read(filepath_or_buffer, kwds)
File "C:\Python34\lib\site-packages\pandas\io\parsers.py" in _read
241. parser = TextFileReader(filepath_or_buffer, **kwds)
File "C:\Python34\lib\site-packages\pandas\io\parsers.py" in __init__
557. self._make_engine(self.engine)
File "C:\Python34\lib\site-packages\pandas\io\parsers.py" in _make_engine
694. self._engine = CParserWrapper(self.f, **self.options)
File "C:\Python34\lib\site-packages\pandas\io\parsers.py" in __init__
1056. self._reader = _parser.TextReader(src, **kwds)
请您参考如下方法:
我认为您不能将 file 对象放入 session 中,因为它不可序列化,存储其文件名并在 graph View 中重新打开文件
