Django 在视图之间传递数据
Posted
技术标签:
【中文标题】Django 在视图之间传递数据【英文标题】:Django Passing data between views 【发布时间】:2011-12-07 11:11:34 【问题描述】:我想知道在视图之间传递数据的“最佳”方式是什么。创建不可见字段并使用 POST 传递它会更好,还是应该在我的 URLS 中对其进行编码?或者有更好/更简单的方法吗?对不起,如果这个问题很愚蠢,我对网络编程很陌生:)
谢谢
【问题讨论】:
我不知道是否可以从这个广泛的问题中确定最好的。你能举出两种观点的例子吗?您可以根据数据类型做任何事情。会话键、隐藏的表单字段、查询字符串。会话密钥可以工作。 会议就是答案!没有更简单更好的方法。会话数据可以保存在数据库、文件或缓存中。 【参考方案1】:在视图之间传递数据有不同的方式。实际上,这与在两个不同脚本之间传递数据的问题并没有太大区别,当然还有一些进程间通信的概念。想到的一些事情是 -
-
GET 请求 - 第一个请求命中 view1-> 将数据发送到浏览器 -> 浏览器重定向到 view2
POST 请求 - (如您所建议)与上述流程相同,但适用于涉及更多数据时
Django 会话变量 - 这是最容易实现的
客户端 cookie - 可以使用,但可以存储的数据量有限制。
网络服务器级别的共享内存- 很棘手,但可以做到。
REST API's - 如果您有一个独立的服务器,那么该服务器可以通过 REST API's 调用视图。
消息队列 - 同样,如果可以使用独立服务器,甚至消息队列也可以工作。即第一个视图(API)接受请求并将其推送到队列中,而其他一些进程可以弹出消息并点击您的第二个视图(另一个 API)。这将解耦第一和第二视图 API,并可能更好地管理负载。
缓存 - 也许像memcached 这样的缓存可以充当中介。但如果要走这条路,最好使用 Django 会话,因为它隐藏了很多实现细节,但如果规模是一个问题,memcached 或 redis 是不错的选择。
持久存储 - 将数据存储在一些持久存储机制中,例如 mysql。这通过在中间放置一个 DB 将您的请求参与(可能是面向客户端的 API)与处理部分分离。
NoSql 存储 - 如果写入速度是每秒数十万的其他顺序,那么 MySql 性能将成为瓶颈(有一些方法可以通过调整 mysql 配置来解决,但这并不容易)。然后考虑 NoSql DB 可能是另一种选择。例如:dynamoDB、Redis、HBase 等。
流处理 - 如果您的用例是实时计算,则可以选择 Storm 或 AWS Kinesis。事实上,您可以在中间使用 AWS Lambda 作为无服务器计算模块,它会读取并调用您的第二个视图 API。
想不起来了。如果我得到任何会更新。希望这会有所帮助。
【讨论】:
不错的清单。 Sessions 是一个很好的起点。使用 GETS 和 POSTS 在视图之间链接变量很麻烦 @pastylegs 同意,GETS 和 POSTS 会很快变得混乱。会话是为这种操作而构建的。我的帖子反映了这种观点。请添加我可能错过的任何内容... 文件一 (6) 和听起来一样脏。我建议从很棒的列表中删除它。 @MohitC 是的,它真的很丑。保留它以确保答案的完整性。不管怎样,我听到了,将第 6 点移到最后,并为此发表免责声明。 当数据不是 JSON 可序列化时会发生什么?在这种情况下,您不能在会话中存储数据。有时,全局定义变量很有用,例如,对于机器学习模型。以上是关于Django 在视图之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章