如何在Django中创建和提供zip文件
我们为我们的平台提供了批量下载所有提交代码的支持。这个特性需要通过Django创建和提供zip文件。
在这篇文章,我将向你展示如何通过管理界面创建一个收集代码的应用snippets,并通过一个下载站点将它们处理为zip文件。让我们直奔主题吧。。。
安装
首先我们创建一个虚拟环境,然后在我们的虚拟环境中设置一个秘钥并安装Django:
现在,让我们在Django里创建一个项目和应用。不要忘了startproject命令最后的点号,否则不会创建额外的子目录。
请确保将新的应用添加到Django配置中:
snippets/settings.py
在此处,加载之前在虚拟环境(venv/bin/activate)定义的秘钥。
最后, 让我们将迁移同步到我们的默认sqlite数据库并创建一个超级用户来访问Django的管理员的后台:
创建路由
在我们的应用snippets中,添加如下路由:
snippets/urls.py
除了默认的admin路由,还要命名空间 archive 应用的路由,将它们定义在应用中:
archive/urls.py
这将成为下载zip文件的下载站点,我们会稍微写一些代码。首先定义模型(数据库表)用于存储我们的代码片段.
创建一个脚本模型
在应用archive,我们创建了这个简单的模型并将它同步到数据库:
archive/models.py
Script类继承了Django的Model类的所有优点, 增加的datetime类型的added字段将在插入数据时自动填充。在类中定义一个__str__方法是为了方便在debug时(或在Django的交互shell)检查对象。并且我们能使用内部Meta类来定义更多的行为,在这个例子中,让我们先看一下最近添加的代码段。
现在,我们必须提交("migrate")这个模型到数据库,这个操作使用Django的manage.py很容易处理。但首先我们需要完成在archive/urls.py定义的下载函数,否则将在迁移数据文件时看到如下错误信息:
AttributeError: module 'archive.views' has no attribute 'download'.
添加下面这些代码到archive/views.py:
archive/views.py
现在它应该可以正常运行了:
我仅使用默认的sqlite数据库,我们可以使用schema来查看migrate操作创建了什么。
Django的管理界面
为了能够从管理界面使用新模型,我们需要先注册它。添加下面的代码到archive/admin.py:
archive/admin.py
现在让我们启动开发服务器。我使用另一个终端让它在前台运行:
现在让我们访问http://localhost:8000/admin,使用我之前创建的超级用户登录。 此时我们应该看到新模型:
我们在贴士页面添加一些代码段。
提供zip文件
现在让我们创建一个包含数据库中所有代码片段的zip文件。我们在先前保存的download视图中进行此操作:
archive/views.py
我们使用Django的HttpResponse对象,这里必须给出Content-Disposition属性。
要直接提供生成的zip文件,而不是将其写入磁盘,我使用zipfile的writestr。从Django的ORM获取片段就像Script.objects.all()一样简单。 我还添加了一个README文件。
现在访问站点:http://localhost:8000/download -> 一个zip文件将自动下载到你的桌面:
让我们通过将获得的zip文件解压缩到tmp目录来查看它是否有效:
太酷了!所以你实现了它:通过一个只有单个模型和视图的小型Django应用程序提供zip文件 :)
一个增强功能是锁定未登录的用户不能使用它。Django很容易实现,只要在download函数最上面添加如下的代码,如果用户未经过身份验证,则返回401。(和相关信息)
此博客文章的完整代码位于我们的博客代码仓库中。
英文原文:https://pybit.es/django-zipfiles.html 译者:亮哥