一尘不染

Django在视图之间传递数据

django

我想知道在视图之间传递数据的“最佳”方法是什么。创建不可见字段并使用POST传递它是否更好,还是应该在URL中对其进行编码?还是有更好/更简便的方法?


阅读 634

收藏
2020-04-02

共1个答案

一尘不染

在视图之间传递数据有多种方法。实际上,这与在两个不同的脚本之间传递数据的问题并没有什么大的不同,当然还引入了一些进程间通信的概念。我想到的一些事情是-

  1. GET请求 -第一个请求命中view1->将数据发送到浏览器->浏览器重定向到view2
  2. POST请求 -(根据你的建议)与上述流程相同,但适用于涉及更多数据的情况
  3. Django会话变量 -这是最简单的实现
  4. 客户端Cookie-可以使用,但存储的数据量有限。
  5. Web服务器级别的共享内存 -棘手,但可以完成。
  6. REST API-如果你可以拥有独立服务器,则该服务器可以使用REST API来调用视图。
  7. 消息队列 -同样,如果可以使用独立服务器,甚至消息队列也可以工作。也就是说,第一个视图(API)接收请求并将其推送到队列中,其他一些进程可能会弹出消息并点击你的第二个视图(另一个API)。这将解耦第一视图API和第二视图API,并可能更好地管理负载。
  8. 缓存 -也许像memcached这样的缓存可以充当中介者。但是,如果采用这种方式,最好使用Django会话,因为它隐藏了很多实现细节,但是如果要考虑扩展性,则最好使用内存缓存或Redis。
  9. 持久存储 -将数据存储在某些持久存储机制(如mysql)中。通过在中间放置一个数据库,可以使你的参与请求(可能是面向客户的API)与处理请求分离。
  10. NoSql存储 -如果写入速度以每秒数十万的其他顺序进行,则MySql的性能将成为瓶颈(有一些方法可以通过调整mysql配置来解决,但这并不容易)。然后考虑使用NoSql DB作为替代方案。例如:dynamoDB,Redis,HBase等。
  11. 如果你的用例是实时计算,则可以选择诸如Storm或AWS Kinesis之类的流处理。实际上,你可以在中间使用AWS Lambda作为无服务器计算模块,该模块将读取并调用你的第二个视图API
2020-04-02