专业编程基础技术教程

网站首页 > 基础教程 正文

Django实战013:各种文件下载功能实现详解

ccvgpt 2024-11-04 12:26:54 基础教程 5 ℃

前后端不分离模式

前后端不分离指的是将前端的代码嵌套在后端代码中,前端页面看到的效果都是由后端控制,由后端来实现渲染的页面或重定向。在Django中常用语法中变量相关的用{{}} , 当模版引擎加载到这个变量时计算该变量并用结果替换掉当前变量。逻辑相关的用{% %},当模版引擎加载到这个逻辑时就会根据逻辑来动态的渲染前端代码。

使用a标签下载

在Django中的setting中设置静态路由:STATIC_URL = '/static/'和静态目录: STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")],然后将需要下载的文件放置该文件目录下。在前端直接把链接地址指向要下载的静态文件,在页面中点击该链接即可直接下载到本地磁盘中了。

Django实战013:各种文件下载功能实现详解

前后端分离模式

前后端分离将业务逻辑和视图渲染进行了拆分,前后负责页面的展示和数据渲染。好处是可以通过JavaScript解决大部分的数据处理工作,减少对服务器的压力。后端则负责业务逻辑和数据的处理,返回前端所需的数据,不再控制渲染前端HTML页面的展示效果。好处是不用再操心前端如何去显示,只要按需求提供接口即可。一套接口可以适用于过个平台使用,提高代码复用性和适用性。大大提高了开发效率。

使用HttpResponse下载

Django在接受到收到客户端发送过来的请求后,会将数据封装成一个HttpRequest对象传给视图函数。当视图函数处理完相关的数据及业务逻辑后需要返回一个响应给浏览器,HttpResponse就是返回对象的一种,HttpResponse会遍历迭代器,调用make_bytes将每个item转换为bytes,再将其拼接为一个字节型字符串对象的内容存储成字符串再回给客户端,这个过程会占用较多的内存。该对象中包含了返回的HTTP响应状态、返回的内容、返回的数据类型等信息。如果你的文件很小可以将文件流放入HttpResponse对象,如果这个文件非常大的话会占用大量内存从而影响服务器性能。

使用StreamingHttpResponse下载

因为HttpResponse将整个文件打包字符串发送给客户端的,整个过程十分浪费时间和内存的,不仅响应慢而且占用服务器较大内存影响性能,如果需要传输较大的文件话HttpResponse显然是不合适的。StreamingHttpResponse则是将文件内容进行流式传输将文件流发送给浏览器,它将迭代器作为传输内容,遍历每个item并返回数据。

如果每次传输的文件流较大我们可以定义一个临时空间作为缓存,来分段存储迭代器读取内容持续传输数据。这样可以提高页面响应的速度,提高用户体验。

使用FileResponse下载

FileResponse是在StreamingHttpResponse基础上进行的进一步封装,FileResponse类针对二进制文件进行了优化,可以更好的支持二进制文件的传输。

文件数据模型

定义模型来保存上传文件的基本信息,包括文件的名字、大小、类型、文件存储路径和创建时间,这里我还定义了一个Md5用来区分文件,防止重复上传相同的文件。定义完之后记得执行迁移命令,同步至数据库:Python manage.py makemigrations 和 python manage.py migrate。

更多Django实战技巧可以参考专栏:Django实战系列

最近发表
标签列表