在jinja
代码中获取当前日期时间值的方法是什么?
在我的项目中,我需要在网站的右上角以UTC显示当前时间。
答案 0 :(得分:9)
我喜欢@ assem-chelli的回答。我将在Jinja2模板中演示它。
#!/bin/env python3
import datetime
from jinja2 import Template
template = Template("""
# Generation started on {{ now() }}
... this is the rest of my template...
# Completed generation.
""")
template.globals['now'] = datetime.datetime.utcnow
print(template.render())
输出:
# Generation started on 2017-11-14 15:48:06.507123
... this is the rest of my template...
# Completed generation.
答案 1 :(得分:7)
您应该使用datetime
Python库,获取时间并将其作为变量传递给模板:
>>> import datetime
>>> datetime.datetime.utcnow()
'2015-05-15 05:22:17.953439'
答案 2 :(得分:2)
对于想将now
标记永久添加回Jinja2的任何人,这里都有一个很好的示例,说明如何将其添加为Jinja扩展名:
https://www.webforefront.com/django/useandcreatejinjaextensions.html
这需要在Django网络应用程序内的python脚本中定义一个新的Jinja扩展名,然后将其作为扩展名导入settings.py
中。
在your_web_app/some_file.py
中(我将其与settings.py
放在同一目录中):
from jinja2 import lexer, nodes
from jinja2.ext import Extension
from django.utils import timezone
from django.template.defaultfilters import date
from django.conf import settings
from datetime import datetime
class DjangoNow(Extension):
tags = set(['now'])
def _now(self, date_format):
tzinfo = timezone.get_current_timezone() if settings.USE_TZ else None
formatted = date(datetime.now(tz=tzinfo),date_format)
return formatted
def parse(self, parser):
lineno = next(parser.stream).lineno
token = parser.stream.expect(lexer.TOKEN_STRING)
date_format = nodes.Const(token.value)
call = self.call_method('_now', [date_format], lineno=lineno)
token = parser.stream.current
if token.test('name:as'):
next(parser.stream)
as_var = parser.stream.expect(lexer.TOKEN_NAME)
as_var = nodes.Name(as_var.value, 'store', lineno=as_var.lineno)
return nodes.Assign(as_var, call, lineno=lineno)
else:
return nodes.Output([call], lineno=lineno)
然后,在settings.py
中,将DjangoNow类添加到extensions
中OPTIONS
下的TEMPLATES
列表中:
TEMPLATES = [
...
{
'BACKEND':'django.template.backends.jinja2.Jinja2',
...
'OPTIONS': {
...,
'extensions': [
'your-app-name.some-file.DjangoNow',
],
}
}
]
然后,您可以像在Django中一样使用now标记,例如:
{% now 'U' %}
答案 3 :(得分:1)
我遇到了同样的问题,但最终找到了jinja2-time:
from jinja2 import Environment
env = Environment(extensions=['jinja2_time.TimeExtension'])
# Timezone 'local', default format -> "2015-12-10"
template = env.from_string("{% now 'local' %}")
# Timezone 'utc', explicit format -> "Thu, 10 Dec 2015 15:49:01"
template = env.from_string("{% now 'utc', '%a, %d %b %Y %H:%M:%S' %}")
# Timezone 'Europe/Berlin', explicit format -> "CET +0100"
template = env.from_string("{% now 'Europe/Berlin', '%Z %z' %}")
# Timezone 'utc', explicit format -> "2015"
template = env.from_string("{% now 'utc', '%Y' %}")
template.render()
有关jinja2-time扩展安装的更多信息:
jinja2-time可通过pip从PyPI下载:
$ pip install jinja2-time
它将自动与箭头一起安装jinja2。
答案 4 :(得分:0)
要将当前日期戳添加到使用Jinja2从HTML模板生成的HTML文档中:
#In the HTML template do:
{{ date.strftime('%B %d, %Y') }} <!-- Output format "Month DD, YYYY" -->
(最少)Python代码:
## Tested in Python 3.6.8
import os
import datetime
import jinja2
JINJA_ENVIRONMENT = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
extensions=['jinja2.ext.autoescape'],
autoescape=True)
#When building the values to pass to jinja
self.datapool=dict()
self.datapool['date']= datetime.datetime.now()
template = JINJA_ENVIRONMENT.get_template('./templates/base-html-template.html')
report=template.render(self.datapool)