响应头信息 下载图片 注意:这里的1指的是MySQL表的主键id 后端实现方式 使用django有三种文件下载方式,分别是HttpResponse,StreamingHttpResponse ,FileResponse 详情,请参考链接 https://www.jb51.net/article/137790.htm 本文主要介绍StreamingHttpResponse实现方式 二、实际操作 download"), ] 修改views.py,增加视图函数 from django.shortcuts import render, HttpResponse from django.http import StreamingHttpResponse yield c else: break try: # 设置响应头 # StreamingHttpResponse 将文件内容进行流式传输,数据量大可以用这个方法 response = StreamingHttpResponse(file_iterator(file_path)) #
而StreamingHttpResponse是将文件内容进行流式传输,数据量大可以用这个方法 方式2: from django.http import StreamingHttpResponse # def download(request): file=open('crm/models.py','rb') response =StreamingHttpResponse(file) response :https://docs.djangoproject.com/en/1.11/ref/request-response/ 推荐使用FileResponse,从源码中可以看出FileResponse是StreamingHttpResponse
response['Content-Disposition']='attachment;filename="example.tar.gz"' return response 方法二:使用StreamingHttpResponse from django.http import StreamingHttpResponse def file_down(request): file=open('/home/amarsoft /download/example.tar.gz','rb') response =StreamingHttpResponse(file) response['Content-Type 为了更好的实现文件下载,FileResponse对StreamingHttpResponse做了进一步的封装,即StreamingHttpResponse是FileResponse的父类。 而HttpResponse,StreamingHttpResponse,FileResponse三者都继承了基类HttpResponseBase。
对象取代HttpResponse对象,StreamingHttpResponse对象用于将文件流发送给浏览器,与HttpResponse对象非常相似,对于文件下载功能,使用StreamingHttpResponse 因此,更加合理的文件下载功能,应该先写一个迭代器,用于处理文件,然后将这个迭代器作为参数传递给StreaminghttpResponse对象,如: from django.http import StreamingHttpResponse def download_file(request): def file_iterator(file, chunk_size=512): yield c else: break file = "file_name.txt" response = StreamingHttpResponse 优化很简单,给StreamingHttpResponse对象的Content-Type和Content-Disposition字段赋下面的值即可,如: response['Content-Type']
Django文档StreamingHttpResponse:https://docs.djangoproject.com/zh-hans/4.2/ref/request-response/#streaminghttpresponse-objects StreamingHttpResponse 用于从 Django 向浏览器流式传输响应。 StreamingHttpResponse的使用方法与常规的HttpResponse类似,只需将生成数据的逻辑写入一个生成器函数,并将该函数作为StreamingHttpResponse的参数传入即可 在每次迭代时,StreamingHttpResponse都会将生成器函数的返回值作为响应内容的一部分发送给客户端,直到生成器结束。 (async_generator()) return response Django 3.1的新特性是将StreamingHttpResponse与异步生成器的结合使用。
我们在django view中,需要用StreamingHttpResponse这两个类。 完整的代码如下: from django.http import StreamingHttpResponse def big_file_download(request): # do something if c: yield c else: break the_file_name = "big_file.pdf" response = StreamingHttpResponse filename) >>> utilities.to_zip(tmp_dl_path, filename) >>> utilities.close() >>> response = StreamingHttpResponse
这时演示的写法,正式项目不会这么写的) views.py代码如下: .. code:: python # coding:utf-8 import time from django.http import StreamingHttpResponse from django.utils.timezone import now def eventsource(request): response = StreamingHttpResponse n' % str(now()) # 发送数据 yield u'data: %s\n\n' % str(now()) time.sleep(2) 里面的StreamingHttpResponse
re import os from datetime import datetime from django.conf import settings from django.http import StreamingHttpResponse report_dir, mtch) with open(report_path, 'w') as f: f.write(html) response = StreamingHttpResponse =UTF-8''{}".format(name) return response 每次下载之后我们都会在本地存放一次,然后我们需要以数据流的方式返回html报告 response = StreamingHttpResponse
(result, status.HTTP_500_INTERNAL_SERVER_ERROR) 说明: file_response = FileResponse(file),可以在引入StreamingHttpResponse 之后(from django.http import StreamingHttpResponse),替换为 file_response = StreamingHttpResponse(file)
流式传输大尺寸CSV文件¶ 当处理生成大尺寸响应的视图时,你可能想要使用Django的StreamingHttpResponse类。 的生成器来有效处理大尺寸CSV文件的拼接和传输: import csv from django.utils.six.moves import range from django.http import StreamingHttpResponse idx in range(65536)) pseudo_buffer = Echo() writer = csv.writer(pseudo_buffer) response = StreamingHttpResponse
流式传输大尺寸CSV文件 当处理生成大尺寸响应的视图时,你可能想要使用Django的StreamingHttpResponse类。 的生成器来有效处理大尺寸CSV文件的拼接和传输: import csv from django.utils.six.moves import range from django.http import StreamingHttpResponse idx in range(65536)) pseudo_buffer = Echo() writer = csv.writer(pseudo_buffer) response = StreamingHttpResponse
对象取代HttpResponse对象,StreamingHttpResponse对象用于将文件流发送给浏览器,与HttpResponse对象非常相似,对于文件下载功能,使用StreamingHttpResponse as f: while True: c = f.read(chunk_size) if c: yield c else: break file = "file_name.txt" response = StreamingHttpResponse (file_iterator(file)) return response from django.http import StreamingHttpResponse def download_file 优化很简单,给StreamingHttpResponse对象的Content-Type和Content-Disposition字段赋下面的值即可,如: response['Content-Type'] as f: while True: c = f.read(chunk_size) if c: yield c else: break file = "big_file.pdf" response = StreamingHttpResponse
Response(result, status.HTTP_500_INTERNAL_SERVER_ERROR) 说明: file_response = FileResponse(file),可以在引入StreamingHttpResponse 之后(from django.http import StreamingHttpResponse),替换为 file_response = StreamingHttpResponse(file) 前端获取响应头中文件名方法如下
get_real_path 是把相对路径转成硬盘的实际路径,自已实现吧 具体看代码: from django.http import HttpResponse, StreamingHttpResponse (request, path): short_file_name, real_file_path = get_real_path(request, path) response = StreamingHttpResponse
通过 StreamingHttpResponse 动态生成 CSV 动态生成文件,最常用的就是流式响应,流式响应最大的优势在于其资源的节省与高效。 代码实现也比较简单。 def large_csv_view(request): response = StreamingHttpResponse(content_type='text/csv') response
response是Django视图或者中间件返回的HttpResponse或者StreamingHttpResponse对象。 process_response()在所有响应返回浏览器之前被调用。 这个方法必须返回HttpResponse或者StreamingHttpResponse对象。 它可以改变已有的response,或者创建并返回新的HttpResponse或StreamingHttpResponse对象。 处理流式响应 不像HttpResponse,StreamingHttpResponse并没有content属性。所以,中间件再也不能假设所有响应都带有content属性。
download_demo import settings from django.utils.encoding import escape_uri_path from django.http import StreamingHttpResponse def big_file_download(self,download_file_path, filename): try: response = StreamingHttpResponse
urllib.request.install_opener(opener) # 开始下载 try: r = urllib.request.urlopen(url=video_download_url) response = StreamingHttpResponse response except Exception as e: print("这里有个错误:", e) return HttpResponse("error,请返回重新搜索") 这里我是使用StreamingHttpResponse
然后就是接收请求的django view: import time from django.http import StreamingHttpResponse from django.template.loader import render_to_string def test(request): return StreamingHttpResponse(stream_response_generator ()) 由于我们不立即返回整个请求,所以并不直接返回HttpResponse对象,而是返回StreamingHttpResponse对象,并且这里的stream_response_generator函数返回的是生成器
对于二进制文件,使用 StreamingHttpResponse 来减少内存使用。 8、如果用户设置了一组 diazo 规则和一个主题模板,则会在响应正文上应用 diazo/XSLT 转换。