Django在视图之间传递数据

时间:2011-10-14 04:43:34

标签: python django django-views

我想知道在视图之间传递数据的“最佳”方式是什么。创建不可见字段并使用POST传递它还是应该在我的URL中编码它更好?或者有更好/更简单的方法吗?很抱歉,如果这个问题很愚蠢,我对网络编程很陌生:)

由于

1 个答案:

答案 0 :(得分:48)

在视图之间传递数据的方法有很多种。实际上,这与在两个不同的脚本之间传递数据的问题并没有太大的不同。当然,一些进程间通信的概念也会出现。想到的一些事情是 -

  1. GET请求 - 首次请求点击view1->向浏览器发送数据 - >浏览器重定向到view2
  2. POST请求 - (如您所建议)与上述流量相同但适用于涉及更多数据时
  3. Django会话变量 - 这是最简单的实现
  4. 客户端Cookie - 可以使用,但存储的数据存在限制。
  5. Web服务器级别的共享内存 - 棘手但可以完成。
  6. REST API - 如果您可以拥有独立服务器,那么该服务器可以使用REST API来调用视图。
  7. 消息队列 - 如果可以使用独立服务器,甚至消息队列也可以工作。即,第一个视图(API)接受请求并将其推送到队列,其他一些进程可以弹出消息并点击您的第二个视图(另一个API)。这将解耦第一个和第二个视图API,并可能更好地管理负载。
  8. 缓存 - 也许像memcached这样的缓存可以充当中介。但是如果一个人走这条路线,最好使用Django会话,因为它隐藏了大量的实现细节,但如果规模是一个问题,memcached或redis是不错的选择。
  9. 持久存储 - 将数据存储在某些持久存储机制(如mysql)中。这会将您的请求(可能是面向API的客户端)与处理部分分开,方法是将DB放在中间。
  10. NoSql存储 - 如果写入速度是每秒数十万的其他顺序,那么MySql性能将成为瓶颈(有很多方法可以通过调整mysql配置来解决这个问题,但这并不容易) 。然后考虑NoSql DB可能是另一种选择。例如:dynamoDB,Redis,HBase等。
  11. 流处理 - 如果您的用例是实时计算,则可以选择StormAWS Kinesis。实际上,您可以在中间使用AWS Lambda作为无服务器计算模块,该模块将读取并调用您的第二个视图API。
  12. 将数据写入文件 - 然后下一个视图可以从该文件中读取(真实难看)。这可能永远不应该完成,但把这一点放在这里是不应该做的事情。
  13. 不能再想了。如果我得到任何更新将更新。希望这在某种程度上有所帮助。