【问题标题】:Loading timestamp upon page load and comparing it to timestamp upon form submit在页面加载时加载时间戳并将其与表单提交时的时间戳进行比较
【发布时间】:2014-08-14 19:06:52
【问题描述】:

我在我的应用程序中开发了一个反垃圾邮件时间陷阱(是的,我知道它不会 100% 有效,但它是一种权宜之计)这样做:

1) 加载页面时,使用 JavaScript 使用时间戳填充隐藏输入:

var timestamp = new Date().getTime() / 1000;

2) 当表单被 POST 时,使用 Python 视图检查这个时间戳与当前时间——如果自页面加载后不到 5 秒,则退回一个异常:

import datetime

feedback_timestamp = request.POST['feedback_timestamp'].strip()
current_timestamp = datetime.datetime.now().timestamp()

if current_timestamp - float(feedback_timestamp) < 5:
    raise Exception("Submitted too quickly after loading!")

这在我的本地开发服务器上运行良好(即它会强制您等待 5 秒,否则它会引发异常)。然而,我注意到,一旦我将它加载到我的生产服务器上,时间戳之间就会相差大约 30 秒,即使我在加载后立即提交了表单。似乎 JavaScript 函数从本地用户获取时间,而 Python 代码从服务器获取时间,因此,如果它们不同步,它将无法正确触发。

我的问题是:如何从服务器而不是本地机器获取初始时间戳?是否有执行此操作的 JavaScript 函数?还是我需要使用 Python 后端填充隐藏的输入?

如果是后者,事情就有点复杂了,因为这一切都在我的 base.html 中完成,我的任何视图都不会直接加载它(即它用于扩展我使用的许多其他视图)。如何在不使用与页面关联的视图的情况下从 Python 后端提取值?

【问题讨论】:

  • 为什么不在本地机器上同时拥有两个时间戳?还是两者都在服务器上?

标签: javascript jquery python django datetime


【解决方案1】:

如果您不想在视图中执行逻辑,可以使用上下文处理器将变量发送到模板:

def add_timestamp_context(request):
    return {'current_time': datetime.datetime.now()}

或类似的东西。有关详细信息,请参阅here。如文档所述,您需要将新函数添加到 settings.py 中的 TEMPLATE_CONTEXT_PROCESSORS 变量中。

您还应该注意,发送到模板的所有变量都将在您的base.html 中可用。因此,您可以将变量从关联视图发送到模板,它会工作,即使前端逻辑在您的 base.html 文件中。

在我看来,最好的解决方案是在前端而不是后端计算两个标记。

【讨论】:

  • 谢谢,我最终在前端计算了提交时间戳并将其提供给后端进行实际比较。很高兴知道我可以使用上下文处理器来执行此操作以供将来参考!
【解决方案2】:

您可以使用上下文处理器将时间戳上下文变量添加到每个模板。您的上下文处理器是一个简单的 Python 函数,它接受一个 HttpRequest 参数并返回一个字典,该字典将添加到您的上下文字典中。

您的函数可能如下所示:

def timestamp(request):
    ctx = {
        'timestamp': timezone.now()
    }
    return ctx

然后,在您的settings.py 中将您的函数添加到TEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (
    ...,
    'path.to.function.context_processors.timestamp',
)

就是这样! See further documentation here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多