【问题标题】:Django timezone.now() remains unchangedDjango timezone.now() 保持不变
【发布时间】:2018-09-12 08:50:43
【问题描述】:

我正在寻找 set token authentification 以便以安全方式下载服务器文件并在过期时间后添加。

要求:

  • Django 1.11
  • Ubuntu 18.04
  • 数据库 PostgreSQL

流程:

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

提交表单时,会发送一封带有生成令牌的电子邮件。这个令牌有一个过期延迟(第一分钟为了做一些测试)。

问题:

当用户点击我的链接时,它会显示token是否在列表中,datetime.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

你有什么想法吗?

【问题讨论】:

  • 您没有在这段代码中调用datetime.now(),也没有显示now 的定义位置。几乎可以肯定的是,您应该在 get_context_data 中定义它,而不是在任何地方进行定义。
  • @DanielRoseman 我在get_context_data 之外定义了now = timezone.now()。我将尝试在内部定义 now() !
  • 你是对的!我将编辑我的标题,你能发布答案吗?我会验证它;)
  • 我希望你的意思是:now = timezone.now——也不要那样做。

标签: python django datetime token


【解决方案1】:

第一次导入模块时会执行类或模块级别的任何代码,因此在该代码中设置的任何值都在该点设置。如果您需要在每个请求上更新值,则需要在方法中设置它们。在这段代码中,将now 的定义移动到get_context_data 方法中会做你想做的事情。

【讨论】:

    猜你喜欢
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2012-10-24
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多