首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对于有效的文件,Django FileField (或ImageField) open()方法返回None吗?

对于有效的文件,Django FileField (或ImageField) open()方法返回None吗?
EN

Stack Overflow用户
提问于 2012-02-24 05:41:54
回答 4查看 33.7K关注 0票数 30

让我这样说:

model.py:

class Task(models.Model):
    ...
    seq_file = models.FileField(upload_to='files/', blank=True, null=True)
    ...

ajax.py (我使用的是dajaxice,但这并不重要):

...
def startTask(request, name):
    task = Task.objects.get(task_name=name)
    data = task.seq_file.open()
    filename = os.path.join(settings.MEDIA_ROOT ,task.seq_file.name)
    if not os.path.isfile(filename):
        raise Exception, "file " + filename + " not found."
    sequences = parser.parse(data.read())
    ...

这将返回:

File "/home/mnowotka/Dokumenty/MgrFuncAdnot/app/django-gui/src/gui/ajax.py", line 43, in startTask
sequences = parser.parse(data.read())

AttributeError: 'NoneType' object has no attribute 'read'

但是:

...
def startTask(request, name):
    task = Task.objects.get(task_name=name)
    filename = os.path.join(settings.MEDIA_ROOT ,task.seq_file.name)
    if not os.path.isfile(filename):
        raise Exception, "file " + filename + " not found."
    data = open(filename)  
    sequences = parser.parse(data.read())
    ...

完美的工作!为什么?

(我使用的是django 1.3)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-24 06:09:16

因为models.FileField的open方法不返回任何内容

您可以只使用:

task.seq_file.read()

而且你不需要计算文件的路径来检查文件是否存在。您可以使用task.seq_file.path:

if not os.path.isfile(task.seq_file.path):
    ....
票数 38
EN

Stack Overflow用户

发布于 2012-02-24 05:57:50

FileField将为您提供一个类似文件的对象,不需要对其调用open()。在您的示例中,只需调用task.seq_file.file

为什么会这样呢?FileField有许多存储后端,并且其中许多后端没有磁盘中的文件支持(例如,请考虑S3存储)。我猜这就是为什么文档说它返回一个类似文件的对象,而不是一个文件。对于某些类型的存储,"open“方法毫无意义。

票数 11
EN

Stack Overflow用户

发布于 2013-12-18 04:04:33

如果有疑问,请检查代码。以下是django.db.models.fields.files的摘录

def open(self, mode='rb'):
    self._require_file()
    self.file.open(mode)
# open() doesn't alter the file's contents, but it does reset the pointer
open.alters_data = True

因此,在FileField的情况下,open使用指定的模式重新打开文件。然后,一旦调用了open,就可以通过新应用的模式继续使用像read这样的方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9421797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档