diff --git a/demos/blog/templates/feed.xml b/demos/blog/templates/feed.xml index a98826c8..c63ef306 100644 --- a/demos/blog/templates/feed.xml +++ b/demos/blog/templates/feed.xml @@ -5,7 +5,7 @@ {% if len(entries) > 0 %} {{ max(e.updated for e in entries).strftime(date_format) }} {% else %} - {{ datetime.datetime.utcnow().strftime(date_format) }} + {{ datetime.datetime.now(datetime.timezone.utc).strftime(date_format) }} {% end %} http://{{ request.host }}/ diff --git a/demos/s3server/s3server.py b/demos/s3server/s3server.py index 5c5e6af2..b798c6b6 100644 --- a/demos/s3server/s3server.py +++ b/demos/s3server/s3server.py @@ -138,7 +138,9 @@ class RootHandler(BaseRequestHandler): buckets.append( { "Name": name, - "CreationDate": datetime.datetime.utcfromtimestamp(info.st_ctime), + "CreationDate": datetime.datetime.fromtimestamp( + info.st_ctime, datetime.timezone.utc + ), } ) self.render_xml({"ListAllMyBucketsResult": {"Buckets": {"Bucket": buckets}}}) diff --git a/tornado/test/web_test.py b/tornado/test/web_test.py index c8dce68c..fec66f39 100644 --- a/tornado/test/web_test.py +++ b/tornado/test/web_test.py @@ -1128,6 +1128,15 @@ class StaticFileTest(WebTestCase): self.assertTrue(b"Disallow: /" in response.body) self.assertEqual(response.headers.get("Content-Type"), "text/plain") + def test_static_files_cacheable(self): + # Test that the version parameter triggers cache-control headers. This + # test is pretty weak but it gives us coverage of the code path which + # was important for detecting the deprecation of datetime.utcnow. + response = self.fetch("/robots.txt?v=12345") + self.assertTrue(b"Disallow: /" in response.body) + self.assertIn("Cache-Control", response.headers) + self.assertIn("Expires", response.headers) + def test_static_compressed_files(self): response = self.fetch("/static/sample.xml.gz") self.assertEqual(response.headers.get("Content-Type"), "application/gzip") diff --git a/tornado/web.py b/tornado/web.py index 333f7368..03939647 100644 --- a/tornado/web.py +++ b/tornado/web.py @@ -2797,7 +2797,8 @@ class StaticFileHandler(RequestHandler): if cache_time > 0: self.set_header( "Expires", - datetime.datetime.utcnow() + datetime.timedelta(seconds=cache_time), + datetime.datetime.now(datetime.timezone.utc) + + datetime.timedelta(seconds=cache_time), ) self.set_header("Cache-Control", "max-age=" + str(cache_time))