社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

如何在Django中创建和提供zip文件

Python程序员 • 7 年前 • 629 次点击  

我们为我们的平台提供了批量下载所有提交代码的支持。这个特性需要通过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 
译者:亮哥
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/34077