Heroku 上 django-import-export 的 Tmpfile 错误
Tmpfile error with django-import-export on Heroku
我正在使用 django-import-export 处理上传到我的 Django 管理站点的 CSV 文件。
当我在本地机器上 运行 Django 时,一切正常。
当我将我的应用程序部署到 Heroku 时,我开始收到与 tmpfile 访问相关的错误:
Feb 24 14:35:12 test-staging app/web.3: ERROR 2017-02-24 22:35:12,143 base 14 139687073408832 Internal Server Error:
....
Feb 24 14:35:12 test-staging app/web.3: File "/app/.heroku/python/lib/python2.7/site-packages/import_export/admin.py", line 163, in process_import
Feb 24 14:35:12 test-staging app/web.3: data = tmp_storage.read(input_format.get_read_mode())
Feb 24 14:35:12 test-staging app/web.3: File "/app/.heroku/python/lib/python2.7/site-packages/import_export/tmp_storages.py", line 42, in read
Feb 24 14:35:12 test-staging app/web.3: with self.open(mode=mode) as file:
Feb 24 14:35:12 test-staging app/web.3: File "/app/.heroku/python/lib/python2.7/site-packages/import_export/tmp_storages.py", line 31, in open
Feb 24 14:35:12 test-staging app/web.3: return open(self.get_full_path(), mode)
Feb 24 14:35:12 test-staging app/web.3: IOError: [Errno 2] No such file or directory: u'/tmp/tmpvCUtrP'
我已经阅读了有关 Heroku 临时存储的所有信息,这似乎应该可行。我已经验证我可以通过 heroku 运行.
使用我的代码在 heroku dyno 上创建、查看和修改 /tmp 中的文件
django-import-export 有一个模块允许您重载临时文件创建机制 - 但我什至不确定这里出了什么问题(或者更确切地说,为什么 /tmp/tmpvCUtrP 没有被创建或不可见)。
django-import-export 将导入过程拆分为对服务器的几个请求。
Heroku 可以使用多个 dyno,它们不在 /tmp 中共享一个公共文件系统。
碰巧初始请求可以执行 dyno A 并在 /tmp/tmpfilename 中创建 tmpfile,然后稍后的请求可以转到 dyno B,并且 django-import-export 需要 /tmp/tmpfilename在场 - 但事实并非如此。
为了解决这个问题,我切换到 django-import-export 的 CacheStorage 临时存储方法:
from import_export.tmp_storages import CacheStorage
class CustomAdminForm(ImportExportModelAdmin):
tmp_storage_class = CacheStorage
我正在使用 django-import-export 处理上传到我的 Django 管理站点的 CSV 文件。
当我在本地机器上 运行 Django 时,一切正常。
当我将我的应用程序部署到 Heroku 时,我开始收到与 tmpfile 访问相关的错误:
Feb 24 14:35:12 test-staging app/web.3: ERROR 2017-02-24 22:35:12,143 base 14 139687073408832 Internal Server Error:
....
Feb 24 14:35:12 test-staging app/web.3: File "/app/.heroku/python/lib/python2.7/site-packages/import_export/admin.py", line 163, in process_import
Feb 24 14:35:12 test-staging app/web.3: data = tmp_storage.read(input_format.get_read_mode())
Feb 24 14:35:12 test-staging app/web.3: File "/app/.heroku/python/lib/python2.7/site-packages/import_export/tmp_storages.py", line 42, in read
Feb 24 14:35:12 test-staging app/web.3: with self.open(mode=mode) as file:
Feb 24 14:35:12 test-staging app/web.3: File "/app/.heroku/python/lib/python2.7/site-packages/import_export/tmp_storages.py", line 31, in open
Feb 24 14:35:12 test-staging app/web.3: return open(self.get_full_path(), mode)
Feb 24 14:35:12 test-staging app/web.3: IOError: [Errno 2] No such file or directory: u'/tmp/tmpvCUtrP'
我已经阅读了有关 Heroku 临时存储的所有信息,这似乎应该可行。我已经验证我可以通过 heroku 运行.
使用我的代码在 heroku dyno 上创建、查看和修改 /tmp 中的文件django-import-export 有一个模块允许您重载临时文件创建机制 - 但我什至不确定这里出了什么问题(或者更确切地说,为什么 /tmp/tmpvCUtrP 没有被创建或不可见)。
django-import-export 将导入过程拆分为对服务器的几个请求。
Heroku 可以使用多个 dyno,它们不在 /tmp 中共享一个公共文件系统。
碰巧初始请求可以执行 dyno A 并在 /tmp/tmpfilename 中创建 tmpfile,然后稍后的请求可以转到 dyno B,并且 django-import-export 需要 /tmp/tmpfilename在场 - 但事实并非如此。
为了解决这个问题,我切换到 django-import-export 的 CacheStorage 临时存储方法:
from import_export.tmp_storages import CacheStorage
class CustomAdminForm(ImportExportModelAdmin):
tmp_storage_class = CacheStorage