【问题标题】:How to create a new token with custom created datetime in Django Rest Framework?如何在 Django Rest Framework 中使用自定义创建的日期时间创建新令牌?
【发布时间】:2021-11-07 19:22:25
【问题描述】:

我在我的 Django Rest Framework 项目中使用令牌身份验证。我注意到,在创建令牌时,如果我在 create 方法中指定 created 日期时间字段,则不会使用该值创建令牌,例如:

new_token = Token.objects.create(user=user, created=datetime(2021, 9, 7, 10, 10, 10, tzinfo=timezone.utc)

不会使用指定的日期时间创建令牌,而是使用当前的 UTC 时间。为了使它工作,我必须对这个对象执行另一个操作并再次保存修改后的对象,如下所示:

new_token = Token.objects.create(user=user) 
new_token.created = datetime(2021, 9, 7, 10, 10, 10, tzinfo=timezone.utc)
new_token.save()

我认为这将在数据库上进行两个查询,首先是在创建时,然后在修改创建的日期时间时,这不是很优雅。有人可以告诉我为什么 Django 没有以第一种方式设置日期时间吗?我对这个框架很陌生,所以如果我在这里忽略了一些非常简单的东西,请原谅我。

谢谢!

【问题讨论】:

  • 请问为什么不在Token 对象的created 字段上使用default=timezone.now 参数?那么你不需要经历这一切来开始
  • 对于DateTimeField,你也可以像这样使用auto_now_add参数:created_date = models.DateTimeField(auto_now_add=True)
  • @DavidCulbreth 感谢您的意见。实际上,我已经稍微修改了 Token Authentication 的行为,并想为它编写单元测试。在某些情况下,我需要在测试中模拟创建的日期时间。我找不到令牌身份验证设置我可以模拟的创建日期时间的源代码,因此,我唯一的选择是自己设置它,然后模拟那个日期时间。我说得有道理吗?或者你能给我指出一个更好的解决方案吗?

标签: django django-rest-framework django-authentication http-token-authentication


【解决方案1】:

好的,我知道为什么这是 Token 的行为了。如果看到Token模型的代码,created字段的定义如下:

created = models.DateTimeField(_("Created"), auto_now_add=True)

auto_now_add=True 值指定此字段将自动设置为当前 UTC 时间。

现在,我想做的是在我的单元测试中模拟这个创建的日期时间来模拟一些情况。我发现您可以模拟 django.utils.timezone.now 返回值来模拟任何创建的日期时间,如下所示:

def my_unit_test(self):
   with patch('django.utils.timezone.now') as fake_dt:
       fake_dt.return_value = datetime(2021, 9, 7, 10, 10, 10, tzinfo=timezone.utc)
       # token's created field will be set to the datetime above
       token = Token.objects.create(user=test_user)

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2013-11-15
    • 2017-05-28
    • 2020-03-25
    • 2023-03-12
    • 2020-04-27
    • 2021-08-10
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多