Pyexcel,加载文件以在内存中创建一本书

时间:2016-04-24 03:51:04

标签: python-3.4 django-1.8 pyexcel

这解决了;感谢@ vmontco的解决方案:我缺少MEDIA_URL,现在它完美无缺。 ----------下面的原始问题-----------

我欢迎各方面的建议;我是Django和Python的新手。我确定我错过了一些简单的事情。

使用带有FileField的模型表单,我将Excel文件上传并保存到MEDIA_ROOT下的文件夹结构中。这很有效。

我想稍后阅读同一个文件,以便使用Pyexcel执行操作。这是我被困的地方。我正在尝试使用存储在数据库中的FileField上传文件。

这是我遇到问题的地方,我不确定是否误解了MEDIA_ROOT或Django的其他方面。

当我将pk传递给第二个视图时,我会基于Model实例化一个对象。它有FileField'docfile',我试图使用它来访问文件以使用Pyexcel执行某些操作,

这是来自models.py的FileField声明:

docfile = models.FileField(
    verbose_name="Choose file to upload:", 
    upload_to='Excel_CSV_Assets/%Y/%m/%d')

编辑:如果我像这样硬编码pth到文件,一切正常,包括之后的操作:

thedocfile='site_static/site/original_assets/Excel_CSV_Assets/2016/04/23/Animals_oglc4DV.xlsx'
book=pyexcel.get_book(file_name=thedocfile)

:编辑结束

以下是第二个视图中的代码,我尝试将文件读入内存,并使用Pyexcel创建一个“book”类对象。我被困在这里:

asset = Excel_CSV_Asset.objects.get(id=assetid)
book=pyexcel.get_book(file_name=asset.docfile)

这是我的错误说明: wrong file name error

以下是我的代码中断的信息: enter image description here

虽然它说“文件名错误”,但我可以看到文件在文件夹中: file_location_name_and_properties

我可以通过双击打开文件;文件没有损坏。

编辑: 如果我将'asset.docfile'转换为str,就像这样:

asset = Excel_CSV_Asset.objects.get(id=assetid)
book=pyexcel.get_book(file_name=str(asset.docfile))

我得到了一个不同的错误:

[Errno 2] No such file or directory: 'Excel_CSV_Assets/2016/04/23/Animals_oglc4DV.xlsx'

...但这是正确的目录,位于MEDIA_ROOT文件结构下面。

这是settings.py MEDIA_ROOT:

MEDIA_ROOT = 'site_static/site/original_assets/'

这是urls.py:

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^e/', include('excel_to_mongo.urls')),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

以下是该应用的url.py:

url(r'^efactory/(?P<assetid>\d+)/$', 'display_sheet_column_choices', {}),

1 个答案:

答案 0 :(得分:1)

我认为你的问题是你没有完全理解Django的媒体文件管理。

什么是媒体文件?

媒体文件是用户上传的所有文件(在运行时)。

您不能将它们误认为是项目工作所需资源的静态文件,而是在开发时添加(例如CSS,背景图片和JS文件)。

您不应混用它们,因为服务器对它们进行了不同的管理,并且可能导致安全问题(参见警告here

静态文件管理:

您将静态文件作为代码的一部分放在已安装的django应用程序的一个static子目录中,或者添加到STATICFILES_DIRS的其中一个位置

在启动服务器之前必须通过调用./manage.py collectstatic收集静态文件,此命令将收集(复制)静态文件到目录(STATIC_ROOT的值)。

然后,您必须设置STATIC_URL以选择您应该为静态文件提供服务的网址。通常的选择是/static/。要访问静态文件,您应该尝试访问/static/path/to/static/file/in/static_root/dir

媒体文件管理:

您的媒体文件会在运行时添加。它们存储在MEDIA_ROOThas to be an absolute path位置。因此我建议你加入BASE_DIR值(绝对路径)和你选择的子目录这样的事实:

MEDIA_ROOT = os.path.join(BASE_DIR, "/media/subdir")

然后,您必须使用MEDIA_URL变量为媒体文件设置网址。要访问媒体文件,网址将以您选择的值开头:

MEDIA_URL = '/media/'

然后,将其添加到您的urls.py文件中:

if settings.DEBUG:
    urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

使用当前示例,您的mymediafile.txt位于/path/to/your/project/media/subdir/path/in/media/root/mymediafile.txt,并在http://127.0.0.1:8000/media/path/in/media/root/mymediafile.txt投放。

但这仅适用于here所述的开发用途。这只适用于DEBUG == TRUE

对于生产用途,您应该考虑deploying your media files与您的http服务器(例如apache)。

结论:

花点时间了解这一点。因为我怀疑你并不真正理解你做了什么,这种缺乏理解可能导致未来的错误和错误。