我有一个应用程序,允许用户上传包含数据的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_ROOT
(MEDIA_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] 删除。
我来说两句