Как заморозить время и установить временную метку в шаблоне?

p1/urls.py:

from django.urls import path
from . import views
urlpatterns = [
    path('t1/', views.t1),
]

p1/views.py:

from django.shortcuts import render
def t1(request):
    return render(request, 'p1/t1.html')

p1/templates/p1/t1.html:

<?xml version="1.0" encoding="UTF-8"?>
<root timestamp="{% now 'Y-m-d H:i:s' %}">...</root>

p1/settings.py:

TIME_ZONE = 'Asia/Tokyo'
USE_TZ = True
INSTALLED_APPS = [
    ...
    'p1',
]

p1/tests.py:

from django.test import TestCase
from freezegun import freeze_time

class MyTestCase(TestCase):
    @freeze_time('2019-01-02 03:04:05')
    def test_freezegun(self):
        expected_response = '''
            <?xml version="1.0" encoding="UTF-8"?>
            <root timestamp="2019-01-02 03:04:05">...</root>
        '''
        response = self.client.get('/t1/')
        self.assertXMLEqual(expected_response, response.content.decode(response.charset))

Потом,

$ ./manage.py test
Creating test database for alias 'default'...
F
======================================================================
FAIL: test_freezegun (p1.tests.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yuri/_/1/env/lib/python3.7/site-packages/freezegun/api.py", line 658, in wrapper
    result = func(*args, **kwargs)
  File "/home/yuri/_/1/p1/p1/tests.py", line 12, in test_freezegun
    self.assertXMLEqual(expected_response, response.content.decode('utf-8'))
  File "/home/yuri/_/1/env/lib/python3.7/site-packages/django/test/testcases.py", line 854, in assertXMLEqual
    self.fail(self._formatMessage(msg, standardMsg))
AssertionError: '\n            <?xml version="1.0" encoding="UTF-8"?>\n            <root timesta [truncated]... != '<?xml version="1.0" encoding="UTF-8"?>\n<root timestamp="2019-01-02 12:04:05">. [truncated]...
- 
-             <?xml version="1.0" encoding="UTF-8"?>
? ------------

+ <?xml version="1.0" encoding="UTF-8"?>
-             <root timestamp="2019-01-02 03:04:05">...</root>
? ------------                            ^^

+ <root timestamp="2019-01-02 12:04:05">...</root>
?                             ^^

-         

----------------------------------------------------------------------
Ran 1 test in 0.031s

FAILED (failures=1)
Destroying test database for alias 'default'...
System check identified no issues (0 silenced).

Что я делаю неправильно? Добавление tz_offset к freeze_time не помогает.

Вы пытались проверить utc, datetime, django now, значения в оболочке? Я думаю, что смещение часового пояса должно работать.

Umair Mohammad 22.05.2019 14:01

добавление tz_offset к freeze_time должно работать, что вы подразумеваете под «не помогает»?

dirkgroten 22.05.2019 15:16

Я только помню, что как ожидаемое, так и фактическое время продолжали меняться по мере того, как менялся я tz_offset. Наверное, у меня было неправильное представление о том, как все это будет работать.

x-yuri 25.05.2019 14:28
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
3
4 356
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Дело в том, что большую часть времени Django хранит метки времени в универсальное глобальное время. И преобразует в местное время только при представлении данные в Пользователь. Таким образом, время, которое я передаю в freeze_time, обрабатывается как UTC, но затем now в шаблоне преобразует его в местное время. Таким образом, я должен либо указать местное время в expected_response (2019-01-02 12:04:05), либо часовой пояс в строке «заморозить время» (2019-01-02 03:04:05 JST), либо добавить tz_offset (JST — это UTC+9h, поэтому tz_offset=-9).

Другие вопросы по теме