在Django的媒体目录中打开数据文件

团结

我有一个应用程序,允许用户上传包含数据的CSV文件,然后将其绘制图形并显示给用户。这些文件另存为媒体文件。但是,在我的图形视图中,我需要打开文件并进行处理。我的问题是,我只能打开项目当前工作目录中的文件,并且每次尝试从该目录之外的某个位置上载文件时,都会出现此错误:

File b'TEST.CSV' does not exist

我已经尝试过了,但是没有成功:

file_upload_dir = os.path.join(settings.MEDIA_ROOT, 'Data_Files')
data_file = open(os.path.join(file_upload_dir, new_file), 'rb')

该变量new_file只是会话中保存的文件名,而不是该文件的路径。Data_Files是媒体目录中包含上载文件的目录。

我对Django的媒体设置是

SETTINGS_DIR = os.path.dirname(__file__)
PROJECT_PATH = os.path.join(SETTINGS_DIR, os.pardir)
PROJECT_PATH = os.path.abspath(PROJECT_PATH)

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media')

有没有一种方法可以从视图中正确引用媒体文件?

这是file_upload_dir新文件的输出和位置。

>>> print(file_upload_dir)
C:\\Users\\vut46744\\Desktop\\graphite_project\\media\\Data_Files

>>> print(os.path.join(file_upload_dir, new_file))
C:\\Users\\vut46744\\Desktop\\graphite_project\\media\\Data_Files\\TEST.CSV
光谱

通常,您不应open()在Django应用中使用访问文件您应该使用存储API。这样一来,您的代码就可以与Django设置以及扩展该API的潜在第三方应用程序良好地配合使用。https://docs.djangoproject.com/zh-CN/1.7/topics/files/#file-storage

所以在这里你应该做类似的事情

from django.core.files.storage import default_storage

f = default_storage.open(os.path.join('Data_Files', new_file), 'r')
data = f.read()
f.close()
print(data)

顺便说一句,如果您希望它是模块化的,那么最好有一个自定义存储类,以便在您的需求发生变化时轻松配置和使用您的应用程序。另外,这允许将文件放在之外MEDIA_ROOT此示例存储将它们放入settings.UPLOADS_ROOTMEDIA_ROOT如果未找到该设置,则默认为)。

# Put this in a storage.py files in your app
from django.conf import settings
from django.core.files.storage import FileSystemStorage, get_storage_class
from django.utils.functional import LazyObject

class UploadsStorage(FileSystemStorage):
    def __init__(self, location=None, base_url=None, *args, **kwargs):
        if location is None:
            location = getattr(settings, 'UPLOADS_ROOT', None)
        super(UploadsStorage, self).__init__(location, base_url, *args, **kwargs)
        self.base_url = None  # forbid any URL generation for uploads

class ConfiguredStorage(LazyObject):
    def _setup(self):
        storage = getattr(settings, 'UPLOADS_STORAGE', None)
        klass = UploadsStorage if storage is None else get_storage_class(storage)
        self._wrapped = klass()
uploads_storage = ConfiguredStorage()

我们在这里创建一个非常简单的存储。它只是常规文件,但是会从另一个目录读取文件。然后,我们设置了一个惰性对象,该对象将允许从设置中覆盖该存储。

现在,您的代码变为:

from myapp.storage import uploads_storage
f = uploads_storage.open(new_files, 'r')

在您的设置中,您UPLOADS_ROOT可以随意设置可能是媒体目录之外的内容。而且,如果有一天您决定将上载存储在数据库中,则可以设置UPLOADS_STORAGE为数据库支持的存储,您的代码将很乐意使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法打开BCP主机数据文件

来自分类Dev

更改数据文件目录Cassandra

来自分类Dev

更改数据文件目录Cassandra

来自分类Dev

我可以使用Selenium IDE从Excel数据文件中打开网站URL吗?

来自分类Dev

将核心数据文件保存在应用程序的“ Library”目录中

来自分类Dev

如何使用pyinstaller在与exe相同的目录中添加二进制数据文件?

来自分类Dev

从数据文件中读取数据点

来自分类Dev

关闭打开的h5py数据文件

来自分类Dev

用C ++打开2个数据文件

来自分类Dev

快速打开1,-1数据文件作为图像

来自分类Dev

SQL Server无法打开BCP主机数据文件

来自分类Dev

数据文件中的几个图

来自分类Dev

从python包中访问数据文件

来自分类Dev

数据文件中的Python Matplotlib IMShow

来自分类Dev

如何从数据文件中减去常数?

来自分类Dev

数据文件中的分割线

来自分类Dev

数据文件中的几个图

来自分类Dev

在python中解析通用数据文件

来自分类Dev

大数据文件中的r droplevel

来自分类Dev

在Java代码中嵌入数据文件

来自分类Dev

处理数据文件中的多列

来自分类Dev

在C ++中读取“大”数据文件

来自分类Dev

数据文件中的行均值

来自分类Dev

在python中解析csv数据文件

来自分类Dev

具有不同大小的多个数据文件目录

来自分类Dev

Django不显示媒体目录中的图像

来自分类Dev

什么是Django中敏感数据文件file_url的安全实现

来自分类Dev

如何在Django媒体文件中创建目录(最佳方法)?

来自分类Dev

如何使用自定义存储属性模拟 django 中的媒体文件目录?