【问题标题】:How does Django construct the url returned by FileSystemStorage?Django如何构造FileSystemStorage返回的url?
【发布时间】:2011-06-17 11:40:00
【问题描述】:

我有一个模型,用于测试目的,只有一个 ImageField。此 ImageField 绑定到 FileSystemStorage,如下所示:

fs_test = FileSystemStorage(location = settings.FS_TEST_FILES,
                            base_url = settings.FS_TEST_URL)

class TestModel(models.Model):
  image = models.ImageField(storage=fs_test,upload_to='image')

设置如下所示:

FS_TEST_FILES = os.path.normpath(MEDIA_ROOT+'/fs_test')
FS_TEST_URL = os.path.normpath(MEDIA_URL+'/fs_test/')

上传时,文件上传到“media/root/fs_test/image/filename.png”。在这里之前不用担心。但是当调用“image.url”时,我得到“media/url/image/filename.png”。那不应该是 base_url+filename,在这种情况下是“media/url/fs-test/image/filename.png”吗?为什么不呢?

编辑: 有关此的更多信息。 Django 的 FileField 类定义 url 访问如下:

def _get_url(self):
    self._require_file()
    return self.storage.url(self.name)
url = property(_get_url)  

Storage 类定义:

def url(self, name):
    if self.base_url is None:
        raise ValueError("This file is not accessible via a URL.")
    return urlparse.urljoin(self.base_url, name).replace('\\', '/')

但我的代码返回标准 MEDIA_URL,而不是 fs_test 中定义的 base_url。

【问题讨论】:

    标签: django storage


    【解决方案1】:

    检查你的前导和尾随斜杠...使用 urlparse 而不是 os

    FS_TEST_URL = urlparse.urljoin(MEDIA_URL,'fs_test/')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      相关资源
      最近更新 更多