2017-09-05 58 views
0

我正在用Django编写仪表板Web应用程序。这是一个物联网平台,用户可以从传感器查看时间序列数据。我正在研究一项功能,该功能将允许用户提取jsoncsv格式的行数据。Django自定义文件存储

我们拥有的是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 

任何反馈将不胜感激。谢谢你的阅读。

回答

0

我有一个演示有关创建QR码,并将其保存在文件系统可以帮助:

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 
+0

感谢张贴。你可以在'views.py',第四行'img = qrcode.make(data)'中添加'qrcode'的定义' –

+0

它是lib的内置方法,只需要返回一个文件对象作为你的CVS – Ykh