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は常に使用されます。

このジレンマを解決するために、私が思いつく解決策は、最初に変換unicodeしてstrから元に戻すカスタム フィルターを作成することです。

# -*- 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 に答える