1

这是我用来datetime在 Jinja2中格式化 a 的代码

# -*- encoding=utf-8

import jinja2
import datetime

now = datetime.datetime.utcnow()

print jinja2.Template(u'''Hello {{ date.strftime('%Y 年 %m 月') }}!''').render(date=now)

的参数中有一些非 ASCII 字符('年月')date.strftime。Jinja2 抱怨说

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print jinja2.Template(u'''Hello {{ date.strftime('%Y 年 %m 月') }}!''').render(date=now)
  File "/usr/local/lib/python2.7/dist-packages/Jinja2-2.6-py2.7.egg/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "<template>", line 1, in top-level template code
UnicodeEncodeError: 'ascii' codec can't encode character u'\u5e74' in position 3: ordinal not in range(128)

然后我将其更改为

print jinja2.Template(u'''Hello {{ date.strftime(u'%Y 年 %m 月') }}!''').render(date=now)

(注意前面的 'u' '%Y 年 %m 月')但是 Jinja2 似乎不处理 Python unicode 文字。它抱怨说

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print jinja2.Template(u'''Hello {{ date.strftime(u'%Y 年 %m 月') }}!''').render(date=now)
  File "/usr/local/lib/python2.7/dist-packages/Jinja2-2.6-py2.7.egg/jinja2/environment.py", line 831, in __new__
    return env.from_string(source, template_class=cls)
  File "/usr/local/lib/python2.7/dist-packages/Jinja2-2.6-py2.7.egg/jinja2/environment.py", line 769, in from_string
    return cls.from_code(self, self.compile(source), globals, None)
  File "/usr/local/lib/python2.7/dist-packages/Jinja2-2.6-py2.7.egg/jinja2/environment.py", line 493, in compile
    self.handle_exception(exc_info, source_hint=source)
  File "<unknown>", line 1, in template
jinja2.exceptions.TemplateSyntaxError: expected token ',', got 'string'

有人可以告诉我正确的方法吗?提前致谢。

4

1 回答 1

1

本问题所述,datetime.strftime不接受unicode字符串。unicode但是,总是使用内部 jinja 。

为了解决这个难题,我可以想到的一个解决方案是编写一个自定义过滤器,它首先转换unicodestr然后返回:

# -*- coding: utf-8 -*-
from jinja2 import Environment, DictLoader
import datetime

def strftime(date, fmt):
    return date.strftime(fmt.encode('utf-8')).decode('utf-8')

env = Environment(loader=DictLoader({'test': u'''Hello {{ d|strftime('%Y 年 %m 月') }}!'''}))
env.filters['strftime'] = strftime
t = env.get_template('test')
print t.render(d=datetime.datetime.utcnow())

(请注意,您必须将自定义过滤器附加到环境。)

于 2013-04-12T16:55:46.517 回答