django orm插入一条_如何在Django中创建和提供zip文件

c4b4c8f002e43fe6a0b9e28da802c956.png

我们为我们的平台提供了批量下载所有提交代码的支持。这个特性需要通过Django创建和提供zip文件。

在这篇文章,我将向你展示如何通过管理界面创建一个收集代码的应用snippets,并通过一个下载站点将它们处理为zip文件。让我们直奔主题吧。。。

安装

首先我们创建一个虚拟环境,然后在我们的虚拟环境中设置一个秘钥并安装Django:

7786ebec11db0949bb5ee1ed2dd29486.png

现在,让我们在Django里创建一个项目和应用。不要忘了startproject命令最后的点号,否则不会创建额外的子目录。

6f0871928adc29abc8dfa1a94162ef33.png

请确保将新的应用添加到Django配置中:

snippets/settings.py

7edf048456f41df71ae1b7046b4d9749.png

在此处,加载之前在虚拟环境(venv/bin/activate)定义的秘钥。

d3ca011450e96430499a987a1fefbe60.png

最后, 让我们将迁移同步到我们的默认sqlite数据库并创建一个超级用户来访问Django的管理员的后台:

b22fc13b0a8bee899e6747e021bf2312.png

创建路由

在我们的应用snippets中,添加如下路由:

snippets/urls.py

ed075014285d3ff378e2732e8a18c3eb.png

除了默认的admin路由,还要命名空间 archive 应用的路由,将它们定义在应用中:

archive/urls.py

f6308c379652c127c4bb7c3609b109ef.png

这将成为下载zip文件的下载站点,我们会稍微写一些代码。首先定义模型(数据库表)用于存储我们的代码片段.

创建一个脚本模型

在应用archive,我们创建了这个简单的模型并将它同步到数据库:

archive/models.py

36774d990150a9ad7ad86a66e990eef2.png

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

a374e5333ecea7c13aa5d2503ead8c46.png

现在它应该可以正常运行了:

9bd97950a1d5f26c6fcb91d9ca40c0a4.png

我仅使用默认的sqlite数据库,我们可以使用schema来查看migrate操作创建了什么。

782e33d1b35ba2d5b6a54ac4350b501c.png

Django的管理界面

为了能够从管理界面使用新模型,我们需要先注册它。添加下面的代码到archive/admin.py:

archive/admin.py

a491b5cf6edbe845279346b9f31003b5.png

现在让我们启动开发服务器。我使用另一个终端让它在前台运行:

075142cc3f82217ea586e79d8f7a41f6.png

现在让我们访问http://localhost:8000/admin,使用我之前创建的超级用户登录。 此时我们应该看到新模型:

478bfa8f5aaa50cde53e4e10f3e54495.png

我们在贴士页面添加一些代码段。

af059b0dd4851332bc3eac0a832d9644.png

b29544449559718aad5e0e3f8b9fd637.png

4d14292ea31ea3e8c315e89908034bd3.png

6ac2b1298adc1ba060a3d9083a3b6a65.png

提供zip文件

现在让我们创建一个包含数据库中所有代码片段的zip文件。我们在先前保存的download视图中进行此操作:

archive/views.py

ff31409f3df113b8ae32f41b25675066.png

我们使用Django的HttpResponse对象,这里必须给出Content-Disposition属性。

要直接提供生成的zip文件,而不是将其写入磁盘,我使用zipfile的writestr。从Django的ORM获取片段就像Script.objects.all()一样简单。 我还添加了一个README文件。

现在访问站点:http://localhost:8000/download -> 一个zip文件将自动下载到你的桌面:

1d4165836e6d088fb31202f748b4cfae.png

让我们通过将获得的zip文件解压缩到tmp目录来查看它是否有效:

9755aebc8403f36a9c02daffe09e7c57.png

太酷了!所以你实现了它:通过一个只有单个模型和视图的小型Django应用程序提供zip文件 :)

一个增强功能是锁定未登录的用户不能使用它。Django很容易实现,只要在download函数最上面添加如下的代码,如果用户未经过身份验证,则返回401。(和相关信息)

5b92a7c7c71dc6a9834ba0ee137307d3.png

此博客文章的完整代码位于我们的博客代码仓库中。

英文原文:https://pybit.es/django-zipfiles.html 
译者:亮哥
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值