簡體   English   中英

Django自定義文件存儲

[英]Django custom file storage

我正在用Django編寫儀表板Web應用程序。 這是一個物聯網平台,用戶可以在其中查看來自傳感器的時間序列數據。 我正在開發一項功能,該功能將允許用戶提取jsoncsv格式的行數據。

我們擁有的是針對時間序列的PSQL + InfluxDB。 我們希望在UI中有一個頁面,用戶可以在其中生成帶有行數據的文件,然后再下載。 用戶還可以查看之前創建的文件(因此我們需要保留所有生成的文件並防止重新創建相同文件)。 我們計划使用python Celery任務創建文件,並在文件創建后將指向該文件的鏈接發送給用戶。

我們正在努力的部分是找到一種方法來為生成的文件編寫模型。

我們的任務是:

  1. 提取行數據並將其傳遞給2)
  2. 生成python文件對象並將其傳遞給3)
  3. 在磁盤上創建並保存文件+創建保存模型對象

現在我們有以下模型:

# 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM