[英]Django custom file storage
我正在用Django編寫儀表板Web應用程序。 這是一個物聯網平台,用戶可以在其中查看來自傳感器的時間序列數據。 我正在開發一項功能,該功能將允許用戶提取json
或csv
格式的行數據。
我們擁有的是針對時間序列的PSQL + InfluxDB。 我們希望在UI中有一個頁面,用戶可以在其中生成帶有行數據的文件,然后再下載。 用戶還可以查看之前創建的文件(因此我們需要保留所有生成的文件並防止重新創建相同文件)。 我們計划使用python Celery任務創建文件,並在文件創建后將指向該文件的鏈接發送給用戶。
我們正在努力的部分是找到一種方法來為生成的文件編寫模型。
我們的任務是:
現在我們有以下模型:
# models.py
from orgs.models import Organization
class Report(models.Model):
name = models.CharField(_('file name'), max_length=128,
unique=True)
file = models.FileField()
org = models.OneToOneField(
Organization,
on_delete=models.PROTECT,
related_name='org',
related_query_name='org',
blank=False,
null=True,
)
和任務任務3)
from reports.models import Report
from django.core.files import File
import hashlib
def sha1_name(org_name, uuid, start, end):
metadata = [org_name, uuid, start, end]
file_name = hashlib.sha1('_'.join(metadata)).hexdigest()
return file_name
def crete_and_save_report_object(org, #etc):
"""
Create report object
:param path_to_file: path to our file
:param org: object of model Organization from orgs.models
:return: report object
"""
with open(path_to_file) as file:
report = Report(name=sha1_name(#etc), file=File(file), org=org)
report.save()
return report
任何反饋將不勝感激。 感謝您的閱讀。
我有一個關於創建二維碼並將其保存在文件系統中的演示,這可能會有所幫助:
models.py
def get_time_filename(filename):
ext = os.path.splitext(filename)[1]
d = os.path.dirname(filename)
current_time = datetime.now().strftime('%Y%m%d-%H%M%S-%f')[:-3]
filename = os.path.join(d, '{}_{}{}'.format(current_time, random.randint(0, 100), ext))
return filename
def qrcode_cover(instance, filename):
return 'qr_code/{}'.format(get_time_filename(filename))
class QRCode(models.Model):
data = models.TextField(verbose_name=u'data')
image = models.ImageField(upload_to=qrcode_cover,
null=True,
verbose_name=u'image ')
class Meta:
verbose_name = 'QRCode'
verbose_name_plural = 'QRCode'
ordering = ('-id',)
def __str__(self):
return self.data
views.py
def get_qr_code(data):
qr_code, is_created = QRCode.objects.get_or_create(data=data)
if is_created:
img = qrcode.make(data)
# ensure media/qr_code/ exist
file_dir = 'qr_code/'
media_root = getattr(settings, 'MEDIA_ROOT', None)
if media_root:
file_dir = os.path.join(media_root, 'qr_code/')
if not os.path.exists(file_dir):
os.makedirs(file_dir)
# get random filename
name = qrcode_cover(qr_code, 'data.png')
# save file to file system
path = os.path.join(media_root, name)
img.save(path)
# save qr_code path to db
qr_code.image = name
qr_code.save()
return qr_code
這是一個下載演示,該演示在生產環境中受apache2和xsendfile支持:
instance = self.get_object()
if settings.DEBUG:
response = HttpResponse(instance.file, content_type='application/force-download')
else:
response = HttpResponse(content_type='application/force-download')
response['X-Sendfile'] = instance.file.path
response['Content-Disposition'] = 'attachment; filename={}'.format(urlquote(instance.filename))
return response
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.