使用 AJAX GET 在缓存页面中生成受 CSRF 保护的表单
Posted
技术标签:
【中文标题】使用 AJAX GET 在缓存页面中生成受 CSRF 保护的表单【英文标题】:Using AJAX GET to generate CSRF protected forms in a cached page 【发布时间】:2017-02-10 23:08:54 【问题描述】:我的页面在数据库访问中使用了过多的时间并且模板处理速度很慢,因此我不得不使用使用 Redis
的 django-cacheops
进行缓存。现在,由于我有使用 csrf
令牌的 POST 表单,因此这些值也将被缓存。我一直在考虑实施以下解决方案,但我仍然不确定它是否明智。
-
为所有用户(无论是否登录)获取一个没有任何表单的统一缓存页面。
如果用户已登录,则使用 AJAX GET 请求启动嵌入在缓存页面中的小脚本以加载表单。
这种方法安全且明智吗?如果是这样,我如何使用 javascript/jQuery 和 cookie 知道我是登录用户(即如何区分客户端的用户和访问者,如服务器端的 request.user.is_authenticated()
)?
【问题讨论】:
【参考方案1】:作为第一种方法,您可以尝试仅缓存最繁重的页面以呈现部分(确保繁重的数据库查询在此之前保持惰性)。您的表单应远离缓存部分。
第二种方法是两阶段缓存:基本思想是您不根据 cookie 和/或用户第一次渲染部分,缓存结果然后渲染之前排除的部分。这样一来,大部分页面和大部分负载都在缓存之后,您只会为每个请求渲染一小部分。
有一个django-phased 库,它实现了这种方法。不过,不确定它是否适合您,以及它与 cacheops 的配合效果如何。
【讨论】:
以上是关于使用 AJAX GET 在缓存页面中生成受 CSRF 保护的表单的主要内容,如果未能解决你的问题,请参考以下文章