Skip to main content
 首页 » 编程设计

python之使用 session 在 Django 中将文件从一个 View 传递到另一个 View

2024年10月25日37zdz8207

我目前的工作项目要求我允许用户上传各种格式的文件(目前只处理 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 中重新打开文件