Python 在Django中使用会话将文件从一个视图传递到另一个视图
我当前的工作项目要求我允许用户上传各种格式的文件(目前仅处理CSV格式),然后使用包含的数据使用库绘制图形 我已经决定,将图形呈现到模板的最简单方法是为图形创建一个特定视图,然后从所需模板(例如,包含文件上载的表单页面)将图像链接到该视图。我对本地路径的文件进行了硬编码,但我似乎无法将上传的文件传递到图形视图。我已经读到使用会话是最简单的方法,但是我的尝试没有成功 以下代码是“我的文件上载表单”视图的代码,该视图出现以下错误:Python 在Django中使用会话将文件从一个视图传递到另一个视图,python,django,session,Python,Django,Session,我当前的工作项目要求我允许用户上传各种格式的文件(目前仅处理CSV格式),然后使用包含的数据使用库绘制图形 我已经决定,将图形呈现到模板的最简单方法是为图形创建一个特定视图,然后从所需模板(例如,包含文件上载的表单页面)将图像链接到该视图。我对本地路径的文件进行了硬编码,但我似乎无法将上传的文件传递到图形视图。我已经读到使用会话是最简单的方法,但是我的尝试没有成功 以下代码是“我的文件上载表单”视图的代码,该视图出现以下错误: 错误#1 InMemoryUploadedFile:sampleCS
错误#1
InMemoryUploadedFile:sampleCSV.csv(application/vnd.ms excel)不可JSON序列化
下面显示的我的图形视图抛出以下错误:错误#2
预期的文件路径名或类似文件的对象,获取类“NoneType”类型
任何关于我明显做错了什么或我可以做什么不同的想法都将不胜感激。谢谢
编辑 根据建议,我尝试存储文件名,然后通过会话传递,但也没有效果。当前错误与上面第二个列出的错误相同。我的实现如下: Models.py 文件上载视图 图形视图 对上述错误的回溯:
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)
我不认为您可以将
文件
对象放入会话中,因为它不可序列化,存储其文件名,然后在图形
视图中重新打开该文件,Django用于会话对象的序列化/反序列化
如果无法重构代码并在列表视图中添加响应,则可能会存储文件,稍后使用python io API检索它们
从文档中可以看出,pickle中可接受的序列化类型有:
没有,真的,假的
整数、长整数、浮点数、复数
普通字符串和Unicode字符串元组、列表、集合和
仅包含可拾取对象的词典
在模块顶层定义的函数
在模块顶层定义的内置函数
在模块顶层定义的类
此类类的实例,其dict或调用getstate()的结果是可选择的感谢您的建议。我试图实现此功能(请参见上面的编辑),但仍然无法获得。请忽略编辑。我发现了我的逻辑错误并将其替换。你的建议很关键。再次感谢。使用memcached之类的东西怎么样?
# 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
class FileUpload(models.Model):
docFile = models.FileField(upload_to='Data_Files', blank=True)
@property
def filename(self):
return os.path.basename(self.docFile.name)
# 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)
)
# 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)