我有一个Django网络应用程序,用户上传图像和其他人查看它们。我在这个应用程序中有一个自定义存储类,用于将图像文件上传到Azure云存储。目前图片上传成功,,但他们的网址没有设置。因此,在我的模板下面的代码产生一个broken image:通过为Azure云存储编写的自定义存储设置Django Imagefield模型属性的url
{% if entry.image_file %}
<img src="{{ entry.image_file.url }}"></img><br>
{% endif %}
你能指出我的自定义存储类缺什么?下面是它的出现在我的models.py目前:
from django.db import models
import os
from django.conf import settings
from django.core.files.storage import Storage
from azure.storage.blob import BlobService
accountName = 'accname'
accountKey = 'acckey'
class OverwriteStorage(Storage):
container = 'containername'
account_name = accountName
account_key = accountKey
def __init__(self, account_name=None, account_key=None, container=None):
if account_name is not None:
self.account_name = account_name
if account_key is not None:
self.account_key = account_key
if container is not None:
self.container = container
def __getstate__(self):
return dict(
account_name=self.account_name,
account_key=self.account_key,
container=self.container
)
def _save(self,name,content):
blob_service = BlobService(account_name=accountName, account_key=accountKey)
import mimetypes
content.open()
content_type = None
if hasattr(content.file, 'content_type'):
content_type = content.file.content_type
else:
content_type = mimetypes.guess_type(name)[0]
print content_type
content_str = content.read()
blob_service.put_blob(
'containername',
name,
content_str,
x_ms_blob_type='BlockBlob',
x_ms_blob_content_type=content_type
)
content.close()
return name
def get_available_name(self,name):
return name
def _get_service(self):
if not hasattr(self, '_blob_service'):
self._blob_service = BlobService(
account_name=self.account_name,
account_key=self.account_key,
protocol='http'
)
return self._blob_service
def _open(self, name, mode='rb'):
from django.core.files.base import ContentFile
contents = self._get_service().get_blob(self.container, name)
return ContentFile(contents)
def _get_properties(self, name):
return self._get_service().get_blob_properties(
self.container,
name
)
def _get_container_url(self):
if not hasattr(self, '_container_url'):
base_url = '{protocol}://{host}/{container}'
if self.cdn_host:
base_url = self.cdn_host
self._container_url = base_url.format({
'protocol': 'http',
'host': self._get_service()._get_host(),
'container': self.container,
})
return self._container_url
def url(self, name):
url = '%s/%s' % (self._get_container_url(), name)
return url
class Entry(models.Model):
description = models.TextField(validators=[MaxLengthValidator(500)])
submitted_on = models.DateTimeField(auto_now_add=True)
image_file = models.ImageField(upload_to=upload_to_location, storage=OverwriteStorage(), null=True, blank=True)
我下面的例子是here。我查看了django documentation的自定义文件存储,如果您滚动浏览上面粘贴的代码,我已经定义了一个url(self, name):
方法。然而这并没有被调用(我已经用print
声明测试过)。请指教!