Django 视图之间数据传递

42 投票
1 回答
20455 浏览
提问于 2025-04-17 04:18

我在想,传递数据到不同的页面(视图)最好的方法是什么?是创建一些看不见的字段,通过POST方式传递数据比较好,还是把数据编码到我的网址里更好?或者有没有更简单的方法呢?抱歉如果这个问题很傻,我对网页编程还很陌生 :)

谢谢

1 个回答

58

在不同的视图之间传递数据有很多种方法。其实这跟在两个不同的脚本之间传递数据的问题差不多,当然也涉及到一些进程间通信的概念。以下是一些可以考虑的方法:

  1. GET请求 - 首先,浏览器向视图1发送请求,视图1将数据发送给浏览器,然后浏览器再重定向到视图2。
  2. POST请求 - (正如你提到的)流程和上面一样,但适合传递更多的数据。
  3. Django会话变量 - 这是最简单的实现方式。
  4. 客户端Cookies - 也可以使用,但存储的数据量有限制。
  5. Web服务器级别的共享内存 - 这有点复杂,但也是可行的。
  6. REST API - 如果你有一个独立的服务器,那么这个服务器可以通过REST API来调用视图。
  7. 消息队列 - 同样,如果可以有独立的服务器,消息队列也许可以工作。比如,第一视图(API)接收请求并将其推送到队列中,其他进程可以从队列中取出消息并访问第二视图(另一个API)。这样可以将第一和第二视图的API解耦,并可能更好地管理负载。
  8. 缓存 - 也许像memcached这样的缓存可以作为中介。但如果走这条路,使用Django会话会更好,因为它隐藏了很多实现细节。如果考虑到扩展性,memcached或redis都是不错的选择。
  9. 持久存储 - 将数据存储在某种持久存储机制中,比如MySQL。这可以将请求处理(可能是面向客户端的API)与处理部分解耦,中间有一个数据库。
  10. NoSql存储 - 如果写入速度达到每秒数十万次,那么MySQL的性能可能会成为瓶颈(虽然有一些方法可以通过调整MySQL配置来解决,但并不简单)。这时可以考虑NoSql数据库,比如DynamoDB、Redis、HBase等。
  11. 流处理 - 像StormAWS Kinesis可以作为实时计算的选项。实际上,你可以在中间使用AWS Lambda作为无服务器计算模块,读取并调用你的第二视图API。
  12. 将数据写入文件 - 然后下一个视图可以从该文件中读取(这非常糟糕)。这可能永远不应该这样做,但我提到这个点是为了强调不应该这样做。

想不出更多的了。如果有新的想法会更新。希望这些对你有所帮助。

撰写回答