如何在Django中的2个单独请求(was:views)中访问临时文件对象

时间:2014-11-13 04:44:06

标签: django temporary-files

找不到直接的,回答这个问题。有没有办法在两个不同的视图中访问Django中的临时文件?说我有以下代码:

view#1(request):
   temp = tempfile.NamedTemporaryFile()
   write_book.save(temp_file)
   temp_file_name = temp_file.name
   print temp_file_name
   request.session['output_file_name'] = temp_file_name
   request.session.modified = True
   return #something or other

view#2(request):
   temp_file_name = request.session['output_file_name']
   temp_file = open(str(temp_file_name))
   #do something with 'temp_file' here

我的问题特别出现在视图#2上,第二行是“open(temp_file_name)”。 Django抱怨这个文件/路径不存在,这与我对tempfile模块的理解是一致的(该文件是“隐藏的”并且仅对Django可用)。

我有办法访问此文件吗?如果它很重要,我只需要阅读它(技术上提供下载)。

2 个答案:

答案 0 :(得分:0)

我认为这是如何跨不同请求而不是不同视图访问NamedTemporaryFile。查看this documentation on NamedTemporaryFile,它表示该文件可以在同一进程中打开,但不一定跨多个进程打开。也许你的另一个视图是在不同的Django进程中调用的。

我的建议是放弃使用NamedTemporaryFile,而只是将其写为永久文件,然后在另一个视图中删除该文件。

答案 1 :(得分:0)

感谢seddonym试图回答。我的搭档为我澄清了这一点......对于NamedTemporaryFile的 Django 版本,seddonym是正确的。通过调用python版本(抱歉,没有足够的信息来发布超链接。愚蠢规则),您可以跨请求访问。

诀窍是设置delete = False参数,并在请求结束时“返回”之前关闭文件。然后,在后续请求中,只需打开(file_name)。 Psuedo代码如下:

>>> import tempfile
>>> file = tempfile.NamedTemporaryFile(delete=False)
>>> file.name
'c:\\users\\(blah)\(blah)\(blah)\\temp\\tmp9drcz9'
>>> file.close()
>>> file
<closed file '<fdopen>', mode 'w+b' at 0x00EF5390>
>>> f = open(file.name)
>>> f
<open file 'c:\users\ymalik\appdata\local\temp\tmp9drcz9', mode 'r' at 0x0278C128>

当然,这是在控制台中完成的,但它也适用于django。