如何使用django自动下载刚生成的报表或者文件?

发布于 2022-09-05 22:04:03 字数 169 浏览 25 评论 0

个人使用django的ORM模型创建了相关业务数据的数据库,然后利用其简洁的方法来产生报表。那么访问django相关页面,获取到用户的POST请求后,从数据库中读取相对应的数据,然后可以利用xlwt或者一些图形模块在本地生成一个类似报告的文件。
那么如何在django上实现,提交数据之后,自动下载这些生成的报告文件?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

已下线请稍等 2022-09-12 22:04:03

http://blog.csdn.net/qq_18863...
这个你可以参考下,这是生成excel文件并传输的代码。只要把POST动作,关联到这段代码,然后就可以实现在post之后,浏览器自动弹出下载提示咯。

你怎么这么可爱啊 2022-09-12 22:04:03

post到后台后,首先读取数据库数据,然后按你说的生成报告文件,然后拼一个该文件所在的路径。接下来看下面的代码,就是一段下载用的,前面让文件流传输到服务器,后面是让文件流写入硬盘。(filename是你的文件名,downpath是你拼的文件路径),就酱!!
def file_iterator(file_name, chunk_size=512):

    with open(file_name) as f:
        while True:
            c = f.read(chunk_size)
            if c:
                yield c
            else:
                break

写入硬盘

response = StreamingHttpResponse(file_iterator(download_path))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{0}"'.format(file_name)
return response
风筝有风,海豚有海 2022-09-12 22:04:03

大概说下我自己的实现方式,首先是获取相关数据之后生成报表文件,然后读取该文件并返回给客户端,代码如下:

def download_file(file_name, root_dir=settings.TMP_PATH):
    """
    下载文件
    :param file_name: 文件名
    :param root_dir:  文件路径
    :return:
    """
    from rexec import FileWrapper

    file_name = file_name.replace("\\", os.path.sep).replace("/", os.path.sep)
    file_str = os.path.sep.join([root_dir, file_name])
    if os.path.isfile(os.path.normpath(file_str)):
        file_name = os.path.basename(file_str).encode("utf-8")
        wrapper = FileWrapper(open(file_str, "rb"))
        response = HttpResponse(wrapper, content_type='application/octet-stream')
        response['Content-Length'] = os.path.getsize(file_str)
        disposition = 'attachment; filename=%s' % file_name
        response['Content-Disposition'] = disposition
        return response
    else:
        raise Http404
        
        
class TestViewSet(View):
    def post(self, request, *args, **kwargs):
        '''
        处理用户提交的POST方法
        '''
        # 获取DB中相关数据
        # 根据DB中获取的相关数据生成报表文件
        # 这里假设生成的报表文件名为 'repo.xlsx',生成报表文件的路径在项目里面的tmp目录下,并且在settings.py里面配置了TMP_PATH = os.path.join(BASE_DIR, 'tmp')
        
        file_name = u'repo.xlsx'
        rsp = download_file(file_name)
        return rsp
岛歌少女 2022-09-12 22:04:03

方式多种多样
1, 如果你采用的是ajax请求, 可以返回静态文件名字a.xlsx, 把你的报表存放入/static/../ , 前端页面就直接window.open('/static/../a.xlsx) ,就可以进行下载

2, 返回文件流:

from django.http import StreamingHttpResponse

def big_file_download(request):
    def file_iterator(file_name, chunk_size=512):
        with open(file_name) as f:
            while True:
                c = f.read(chunk_size)
                if c:
                    yield c
                else:
                    break

    the_file_name = "file_name.txt"
    response = StreamingHttpResponse(file_iterator(the_file_name))
    return response
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文