Python Web应用程序Django框架简介

首页

2018-12-06

我们没有包括delete,因为我们不需要对delete操作做任何事情。 如果你可以删除一个对象,只需使用object_()。

以下是一些序列化数据的示例:使用ModelSerializer对象可以做更多的事情,我建议查看以获得更强大的功能。

否则,这就是我们所需要的。

现在是时候深入视图了。 查看视图我们已经构建了模型和序列化器,现在我们需要为我们的应用程序设置视图和URL。 毕竟,对于没有视图的应用程序,我们无法做任何事情。

我们已经看到了上面的HelloWorld视图的示例。 然而,这总是一个人为的、概念验证的例子,并没有真正展示DjangoREST框架的视图可以做些什么。

让我们清除HelloWorld视图和URL,这样我们就可以从我们的视图重新开始。 我们要构建的第一个视图是InfoView。

与之前的框架一样,我们只想打包并发送一个我们用到的路由的字典。

视图本身可以存在于django_中,因为它与特定模型无关(因此在概念上不属于特定应用程序)。

这与我们在Tornado中所拥有的完全相同。 让我们将它放置到合适的路由并继续。 为了更好的测试,我们还将删除admin/路由,因为我们不会在这里使用Django管理后端。 连接模型与视图让我们弄清楚下一个URL,它将是创建新的Task或列出用户现有任务的入口。

这应该存在于todo应用程序的中,因为它必须专门处理Task对象而不是整个项目的一部分。 这个路由处理的是什么?我们根本没有指定特定用户或路径。

由于会有一些路由需要基本路径/api/v1/accounts/username/tasks,为什么我们只需写一次就能一次又一次地写它?Django允许我们用一整套URL并将它们导入django_todo/文件。 然后,我们可以为这些导入的URL中的每一个提供相同的基本路径,只关心可变部分,你知道它们是不同的。 现在,来自todo/的每个URL都将以路径api/v1/accounts/str:username/tasks为前缀。

让我们在todo/中构建视图。 这里一点代码里面有许多要说明的,让我们来看看吧。

我们从与我们一直使用的APIView的继承开始,为我们的视图奠定基础。 我们覆盖了之前覆盖的相同get方法,添加了一个参数,允许我们的视图从传入的请求中接收username。

然后我们的get方法将使用username来获取与该用户关联的Owner。 这个get_object_or_404函数允许我们这样做,添加一些特殊的东西以方便使用。 如果无法找到指定的用户,那么查找任务是没有意义的。 实际上,我们想要返回404错误。 get_object_or_404根据我们传入的任何条件获取单个对象,并返回该对象或引发。

我们可以根据对象的属性设置该条件。 Owner对象都通过user属性附加到User。 但是,我们没有要搜索的User对象,我们只有一个username。

所以,当你寻找一个Owner时,我们对get_object_or_404说:通过指定user__username(这是两个下划线)来检查附加到它的User是否具有我想要的username。

通过QuerySet过滤时,这两个下划线表示此嵌套对象的属性。

这些属性可以根据需要进行深度嵌套。

我们现在拥有与给定用户名相对应的Owner。 我们使用Owner来过滤所有任务,只用检索它拥有的任务。 我们可以使用与get_object_or_404相同的嵌套属性模式来钻入连接到Tasks的Owner的User(tasks=(owner__user__username=username)).all()),但是没有必要那么宽松。

(owner=owner).all()将为我们提供与我们的查询匹配的所有Task对象的QuerySet。

很棒。

然后,TaskSerializer将获取QuerySet及其所有数据以及many=True标志,以通知其为项目集合而不是仅仅一个项目,并返回一系列序列化结果。 实际上是一个词典列表。 最后,我们使用JSON序列化数据和用于查询的用户名提供传出响应。

处理POST请求post方法看起来与我们之前看到的有些不同。 当我们从客户端接收数据时,我们使用JSONParser().parse(request)将其解析为字典。

我们将所有者添加到数据中并格式化任务的due_date(如果存在)。

我们的TaskSerializer完成了繁重的任务。

它首先接收传入的数据并将其转换为我们在模型上指定的字段。 然后验证该数据以确保它适合指定的字段。 如果附加到新Task的数据有效,它将使用该数据构造一个新的Task对象并将其提交给数据库。 然后我们发回适当的耶!我们做了一件新东西!响应。

如果没有,我们收集TaskSerializer生成的错误,并将这些错误发送回客户端,并返回400BadRequest状态代码。 如果我们要构建put视图来更新Task,它看起来会非常相似。

主要区别在于,当我们实例化TaskSerializer时,我们将传递旧对象和该对象的新数据,如TaskSerializer(existing_task,data=data)。 我们仍然会进行有效性检查并发回我们想要发回的响应。

总结Django作为一个框架是高度可定制的,每个人都有自己打造Django项目的方式。

我在这里写出来的方式不一定是Django建立项目的确切方式。 它只是a)我熟悉的方式,以及b)利用Django的管理系统。

当你将概念切分到不同的小块时,Django项目的复杂性会增加。 这样做是为了让多个人更容易为整个项目做出贡献,而不会麻烦彼此。 然而,作为Django项目的大量文件映射并不能使其更高效或自然地偏向于微服务架构。

相反,它很容易成为一个令人困惑的独石应用,这可能对你的项目仍然有用,它也可能使你的项目难以管理,尤其是随着项目的增长。

仔细考虑你的需求并使用合适的工具来完成正确的工作。 对于像这样的简单项目,Django可能不是合适的工具。

Django旨在处理多种模型,这些模型涵盖了不同的项目领域,但它们可能有一些共同点。

这个项目是一个小型的双模型项目,有一些路由。 即便我们把它构建更复杂,也只有七条路由,而仍然只是相同的两个模型。

这还不足以证明一个完整的Django项目。 如果我们期望这个项目能够拓展,那么将会是一个很好的选择。

这不是那种项目。

这就是使用火焰喷射器来点燃蜡烛,绝对是大材小用了。

尽管如此,Web框架就是一个Web框架,无论你使用哪个框架。 它都可以接收请求并做出任何响应,因此你可以按照自己的意愿进行操作。 只需要注意你选择的框架所带来的开销。

【责任编辑:TEL:(010)68476606】。