Django timezone.now()保持不变

时间:2018-09-12 08:50:44

标签: python django datetime token

我正在寻找集合token authentification,以便以安全的方式下载服务器文件并在到期后添加。

要求:

  • Django 1.11
  • Ubuntu 18.04
  • 数据库PostgreSQL

过程:

用户使用某些信息CustomerForm(email, ...)填写表格,并且他必须选择一个或多个带有复选框的文档。

提交表单后,将发送一封带有生成令牌的电子邮件。该令牌具有到期延迟(为了进行一些测试,请在第一分钟内进行延迟)。

问题:

当用户单击我的链接时,它将显示tokendatetime.now()是否在列表中expiration_delay

但是,如果我在链接上再单击一次(也许在第一个链接之后30秒),则datetime.now()仍然是第一个链接。它应该改变。

我怀疑cookie可以保持其内部价值,但是我不知道这是否是正确的方法。

我的文件:

我认为我有一个可以填写表格,生成令牌并发送电子邮件的类。

然后,我有了这个新类,可以将token与数据库进行比较,并将expiration_timenow()也进行比较。

class TokenDownloadView(TemplateView):
    template_name = 'app/token.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['token'] = self.kwargs['token']
        token = context['token']
        print(token)
        download = Download.objects.get(token__iexact=token)

        if download and download.expiration_date > now:
            print("token valide jusqu'à : " + str(download.expiration_date))
            print("il est actuellement : " + str(now))
            print(' ==> Token existe et valide <==')

        if download and download.expiration_date < now:
            print("token valide jusqu'à : " + str(download.expiration_date))
            print("il est actuellement : " + str(now))
            print('==> Token existe mais a expiré <==')

        return context

这是我在终端中获得的,目的是显示我说的话:

d0ce9328a53032d4484cccff4c0bdd92ad701567
token valide jusqu'à : 2018-09-12 07:46:30.082915+00:00
il est actuellement : 2018-09-12 07:45:30.082915+00:00
 ==> Token existe et valide <==
[12/Sep/2018 09:45:42] "GET /crud/download/token/d0ce9328a53032d4484cccff4c0bdd92ad701567/ HTTP/1.1" 200 7447
[12/Sep/2018 09:45:42] "GET /static/css/common-8073709e.css HTTP/1.1" 404 1682
d0ce9328a53032d4484cccff4c0bdd92ad701567
token valide jusqu'à : 2018-09-12 07:46:30.082915+00:00
il est actuellement : 2018-09-12 07:45:30.082915+00:00
 ==> Token existe et valide <==
[12/Sep/2018 09:46:10] "GET /crud/download/token/d0ce9328a53032d4484cccff4c0bdd92ad701567/ HTTP/1.1" 200 7447
[12/Sep/2018 09:46:10] "GET /static/css/common-8073709e.css HTTP/1.1" 404 1682
d0ce9328a53032d4484cccff4c0bdd92ad701567
token valide jusqu'à : 2018-09-12 07:46:30.082915+00:00
il est actuellement : 2018-09-12 07:45:30.082915+00:00
 ==> Token existe et valide <==
[12/Sep/2018 09:46:30] "GET /crud/download/token/d0ce9328a53032d4484cccff4c0bdd92ad701567/ HTTP/1.1" 200 7447
[12/Sep/2018 09:46:30] "GET /static/css/common-8073709e.css HTTP/1.1" 404 1682
d0ce9328a53032d4484cccff4c0bdd92ad701567
token valide jusqu'à : 2018-09-12 07:46:30.082915+00:00
il est actuellement : 2018-09-12 07:45:30.082915+00:00
 ==> Token existe et valide <==
[12/Sep/2018 09:46:41] "GET /crud/download/token/d0ce9328a53032d4484cccff4c0bdd92ad701567/ HTTP/1.1" 200 7447
[12/Sep/2018 09:46:41] "GET /static/css/common-8073709e.css HTTP/1.1" 404 1682

你有什么主意吗?

1 个答案:

答案 0 :(得分:2)

在首次导入模块时,将执行任何类或模块级别的代码,因此在该点上将设置该代码中设置的任何值。如果您需要在每个请求中更新值,则需要在方法中设置它们。在这段代码中,将now的定义移到get_context_data方法中即可完成您想要的工作。