How to implement file download function in Django
This time I will show you how to implement the file download function in Django. What are the precautions for Django to implement the file download function. The following is a practical case. Let’s take a look. one time.
If a website built based on Django provides a file download function, the easiest way is to hand over the static files to Nginx for processing. However, sometimes, due to the logic of the website itself, it is necessary to provide the download function through Django, such as Page data export function (download dynamically generated files), check user permissions before downloading files, etc. Therefore, it is necessary to study the implementation of the file download function in Django.
The simplest implementation of file download function
Just put the file stream into the HttpResponse object, such as:
def file_download(request): # do something... with open('file_name.txt') as f: c = f.read() return HttpResponse(c)
This method is simple and crude, suitable for downloading small files, but if the file is very large, this method will occupy a lot of memory and even cause the server to crash
More reasonable file download function
Django's HttpResponse object allows iterators to be passed in as parameters. By replacing the incoming parameter c in the above code with an iterator, the above download function can be optimized to be suitable for both large and small files; and Django goes one step further and recommends using StreamingHttpResponse Object replaces the HttpResponse object. The StreamingHttpResponse object is used to send a file stream to the browser. It is very similar to the HttpResponse object. For the file download function, it is more reasonable to use the StreamingHttpResponse object.
Therefore, for a more reasonable file download function, you should first write an iterator for processing files, and then pass this iterator as a parameter to the StreaminghttpResponse object, such as:
from django.http import StreamingHttpResponse def big_file_download(request): # do something... 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
The file download function is optimized again
The above code has completed transferring the files on the server to the browser through file streaming. However, the file stream is usually displayed in the browser in garbled form instead of being downloaded to the hard disk. Therefore, some optimizations need to be done. Let the file stream be written to the hard disk. Optimization is very simple. Just assign the following values to the Content-Type and Content-Disposition fields of the StreamingHttpResponse object, such as:
response['Content-Type'] = 'application/octet-stream' response['Content-Disposition'] = 'attachment;filename="test.pdf"'
The complete code is as follows:
from django.http import StreamingHttpResponse def big_file_download(request): # do something... 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 = "big_file.pdf" response = StreamingHttpResponse(file_iterator(the_file_name)) response['Content-Type'] = 'application/octet-stream' response['Content-Disposition'] = 'attachment;filename="{0}"'.format(the_file_name) return response
Specific export file format
Export Excel table
1. First, export the Excel table directly
First get the data to be exported and save it in list form.
The data is then written to Excel and returned to the page for download in a streaming manner.
import xlwt import io import json from django.http import HttpResponse def set_style(name, height, bold=False): style = xlwt.XFStyle() # 初始化样式 font = xlwt.Font() # 为样式创建字体 font.name = name # 'Times New Roman' font.bold = bold font.color_index = 000 font.height = height style.font = font # 设置单元格边框 # borders= xlwt.Borders() # borders.left= 6 # borders.right= 6 # borders.top= 6 # borders.bottom= 6 # style.borders = borders # 设置单元格背景颜色 # pattern = xlwt.Pattern() # 设置其模式为实型 # pattern.pattern = pattern.SOLID_PATTERN # 设置单元格背景颜色 # pattern.pattern_fore_colour = 0x00 # style.pattern = pattern return style def write_excel(data, name, header): # 打开一个Excel工作簿 file = xlwt.Workbook() # 新建一个sheet,如果对一个单元格重复操作,会引发异常,所以加上参数cell_overwrite_ok=True table = file.add_sheet(name, cell_overwrite_ok=True) if data is None: return file # 写标题栏 row0 = [u'业务', u'状态', u'北京', u'上海', u'广州', u'深圳', u'状态小计'] for i in range(0, len(row0)): table.write_merge(0, 0, i, i, row0[i], set_style('Times New Roman', 220, True)) table.write_merge(0, 2, 7, 9, "单元格合并", set_style('Times New Roman', 220, True)) """ table.write_merge(x, x + m, y, w + n, string, sytle) x表示行,y表示列,m表示跨行个数,n表示跨列个数,string表示要写入的单元格内容,style表示单元格样式。其中,x,y,w,h,都是以0开始计算的。 """ l = 0 n = len(header) # 写入数据 for line in data: for i in range(n): table.write(l, i, line[header[i]]) l += 1 # 直接保存文件 # file.save("D:/excel_name.xls") # 写入IO res = get_excel_stream(file) # 设置HttpResponse的类型 response = HttpResponse(content_type='application/vnd.ms-excel') from urllib import parse response['Content-Disposition'] = 'attachment;filename=' + parse.quote("excel_name") + '.xls' # 将文件流写入到response返回 response.write(res) return response def get_excel_stream(file): # StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。 excel_stream = io.BytesIO() # 这点很重要,传给save函数的不是保存文件名,而是一个BytesIO流(在内存中读写) file.save(excel_stream) # getvalue方法用于获得写入后的byte将结果返回给re res = excel_stream.getvalue() excel_stream.close() return res
2. Export json file
Exporting json files is not as troublesome as Excel. You only need to splice json format data. It is still very simple to export directly to the local. But when exporting to a web page, how can you directly return the stream without saving it to the local like exporting excel?
def write_json(data): try: json_stream = get_json_stream(data) response = HttpResponse(content_type='application/json') from urllib import parse response['Content-Disposition'] = 'attachment;filename=' + parse.quote("test") + '.json' response.write(json_stream) return response except Exception as e: print(e) def get_json_stream(data): # 开始这里我用ByteIO流总是出错,但是后来参考廖雪峰网站用StringIO就没问题 file = io.StringIO() data = json.dumps(data) file.write(data) res = file.getvalue() file.close() return res
3. Export compressed package
Since exporting two files cannot return both at the same time, consider putting the two files into a package and then returning the package as a stream.
think? What is exported at this time is a zip package. How do I write these two file streams into the zip package? It seems a bit unreasonable. Later, under the guidance of the boss, the files to be packaged were saved locally, and after being packaged into zip, the local files were deleted, and then the zip file stream was read, written to the response, and returned to the zip file stream.
def write_zip(e_data, j_data, export_name): try: # 保存到本地文件 # 返回文件名,注意此时保存的方法和前面导出保存的json、excel文件区别 j_name = write_json(j_data, export_name[1]) e_name = write_excel(e_data, export_name[1]) # 本地文件写入zip,重命名,然后删除本地临时文件 z_name='export.zip' z_file = zipfile.ZipFile(z_name, 'w') z_file.write(j_name) z_file.write(e_name) os.remove(j_name) os.remove(e_name) z_file.close() # 再次读取zip文件,将文件流返回,但是此时打开方式要以二进制方式打开 z_file = open(z_name, 'rb') data = z_file.read() z_file.close() os.remove(z_file.name) response = HttpResponse(data, content_type='application/zip') from urllib import parse response['Content-Disposition'] = 'attachment;filename=' + parse.quote(z_name) return response except Exception as e: logging.error(e) print(e)
I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to other related articles on the php Chinese website!
Recommended reading:
Detailed explanation of the steps for vue to use the xe-utils function library
vue2.0 routing is not displayed How to handle router-view
How does Native use fetch to implement the image upload function
The above is the detailed content of How to implement file download function in Django. For more information, please follow other related articles on the PHP Chinese website!

JavaScript's application in the real world includes front-end and back-end development. 1) Display front-end applications by building a TODO list application, involving DOM operations and event processing. 2) Build RESTfulAPI through Node.js and Express to demonstrate back-end applications.

The main uses of JavaScript in web development include client interaction, form verification and asynchronous communication. 1) Dynamic content update and user interaction through DOM operations; 2) Client verification is carried out before the user submits data to improve the user experience; 3) Refreshless communication with the server is achieved through AJAX technology.

Understanding how JavaScript engine works internally is important to developers because it helps write more efficient code and understand performance bottlenecks and optimization strategies. 1) The engine's workflow includes three stages: parsing, compiling and execution; 2) During the execution process, the engine will perform dynamic optimization, such as inline cache and hidden classes; 3) Best practices include avoiding global variables, optimizing loops, using const and lets, and avoiding excessive use of closures.

Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

Python and JavaScript have their own advantages and disadvantages in terms of community, libraries and resources. 1) The Python community is friendly and suitable for beginners, but the front-end development resources are not as rich as JavaScript. 2) Python is powerful in data science and machine learning libraries, while JavaScript is better in front-end development libraries and frameworks. 3) Both have rich learning resources, but Python is suitable for starting with official documents, while JavaScript is better with MDNWebDocs. The choice should be based on project needs and personal interests.

The shift from C/C to JavaScript requires adapting to dynamic typing, garbage collection and asynchronous programming. 1) C/C is a statically typed language that requires manual memory management, while JavaScript is dynamically typed and garbage collection is automatically processed. 2) C/C needs to be compiled into machine code, while JavaScript is an interpreted language. 3) JavaScript introduces concepts such as closures, prototype chains and Promise, which enhances flexibility and asynchronous programming capabilities.

Different JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.

JavaScript's applications in the real world include server-side programming, mobile application development and Internet of Things control: 1. Server-side programming is realized through Node.js, suitable for high concurrent request processing. 2. Mobile application development is carried out through ReactNative and supports cross-platform deployment. 3. Used for IoT device control through Johnny-Five library, suitable for hardware interaction.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

WebStorm Mac version
Useful JavaScript development tools

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.