【问题标题】:Django-Filebrowser 500 Error on Heroku + S3Heroku + S3 上的 Django-Filebrowser 500 错误
【发布时间】:2016-07-01 05:26:38
【问题描述】:

在 POST 时在 Heroku 上使用 Filebrowser 和 S3 时出现 500 错误。我已经添加了堆栈跟踪和模型信息 :) 这可能是 S3 问题还是与 Filebrowser 有关?

来自终端的堆栈跟踪:

[01/Jul/2016 05:19:10] "GET /admin/filebrowser/browse/?pop=1&dir=300x250/160x600 HTTP/1.1" 500 76295
Internal Server Error: /admin/filebrowser/browse/
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/scott/Sites/banner_preview_tool_venv/banner_preview_tool/filebrowser/decorators.py", line 35, in decorator
if get_path('', site=site) is None:
File "/Users/scott/Sites/banner_preview_tool_venv/banner_preview_tool/filebrowser/decorators.py", line 18, in get_path
if site.storage.isdir(converted_path):
File "/usr/local/lib/python2.7/site-packages/django/utils/functional.py", line 205, in inner
return func(self._wrapped, *args)
AttributeError: 'MediaStorage' object has no attribute 'isdir'
2016-07-01 05:19:14,947 ERROR Internal Server Error: /admin/filebrowser/browse/
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/scott/Sites/banner_preview_tool_venv/banner_preview_tool/filebrowser/decorators.py", line 35, in decorator
if get_path('', site=site) is None:
File "/Users/scott/Sites/banner_preview_tool_venv/banner_preview_tool/filebrowser/decorators.py", line 18, in get_path
if site.storage.isdir(converted_path):
File "/usr/local/lib/python2.7/site-packages/django/utils/functional.py", line 205, in inner
return func(self._wrapped, *args)
AttributeError: 'MediaStorage' object has no attribute 'isdir'

这是模型:

file = FileBrowseField("HTML or ZIP File", max_length=256, blank=True, null=True, extensions=[".zip",".html"], help_text="Upload an html file or a zip file of banners")

def save(self, *args, **kwargs):
    self.slug = slugify(self.name)

    super(BannerCode, self).save(*args, **kwargs)

def __unicode__(self):
    return self.name

def post_upload_callback(sender, **kwargs):
    if kwargs['file'].extension == ".zip":
        path = kwargs['path'] 
        thefile = kwargs['file'] 

        # Convert file and dir into absolute paths
        fullpath = os.path.join(settings.MEDIA_ROOT, '' + thefile.path)
        dirname = os.path.dirname(fullpath)

        # Get a real Python file handle on the uploaded file
        fullpathhandle = open(fullpath, 'r') 

        # Unzip the file, creating subdirectories as needed
        zfobj = zipfile.ZipFile(fullpathhandle)
        for name in zfobj.namelist():
            if name.endswith('/'):
                try: # Don't try to create a directory if exists
                    os.mkdir(os.path.join(dirname, name))
                except:
                    pass
            else:
                outfile = open(os.path.join(dirname, name), 'wb')
                outfile.write(zfobj.read(name))
                outfile.close()

        # Now try and delete the uploaded .zip file and the  __MACOSX dir if they exist.
        try:
            os.remove(fullpath)
        except:
            pass

        try:
            osxjunk = os.path.join(dirname,'__MACOSX')
            shutil.rmtree(osxjunk)
        except:
            pass                

# Signal provided by FileBrowser on every successful upload. 
filebrowser_post_upload.connect(post_upload_callback)

我什至不知道如何开始调试这个。有人对此有见解吗?谢谢!

【问题讨论】:

  • 向我们展示完整的堆栈跟踪和生成错误的代码将是一个很好的起点;-)。
  • 添加到上面 :-) 谢谢
  • MediaStorage 来自哪里?请向我们展示您配置的存储后端。
  • 我正在定义一个自定义存储:- 在 settings.py 中 DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage' 在 custom_storages.py 中:from django.conf import settings from storages.backends.s3boto import S3BotoStorage class StaticStorage(S3BotoStorage): location = settings.STATICFILES_LOCATION class MediaStorage(S3BotoStorage): location = settings.MEDIAFILES_LOCATION
  • 文件浏览器与 django-storages 不兼容。有一个 lengthy discussion on the issue 以及一堆代码 sn-ps 提供解决方法。

标签: django heroku django-storage django-filebrowser


【解决方案1】:

忘记回答了……

文件浏览器与 django-storages 不兼容。

感谢@solarissmoke

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 2014-10-12
    • 2011-09-02
    • 2017-07-29
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    相关资源
    最近更新 更多