- 0
Как написать расширение для jinja2?
Хочу научиться разрабатывать расширения для jinja2. По какому принципу их создавать? Пока осилил такой код:
class MediaExtension(Extension):
tags = ['media']
def parse(self, parser):
stream = parser.stream
tag = stream.next()
args = [parser.parse_expression()]
if parser.stream.skip_if('comma'):
args.append(parser.parse_expression())
else:
args.append(nodes.Const(None))
print args
lineno = stream.current.lineno
return nodes.CallBlock(
self.call_method('_media', args),[], [], None).set_lineno(lineno)
def _media(self, path, params='', caller=None):
print caller
print "test2"
return u"test"
Пока получаю такую ошибку: 'NoneType' object is not iterable
Не пойму вот какой момент. Что должен возвращать метод parser? Что должен принимать и возвращать _media?
3 ответа:
-
- 0
Я бы посоветовал сходить на курсы по программированию, выбрав их на портале Бизнес-обучение в Екатеринбурге
-
- 0
parser возвращает одну или несколько (list) нод. А вот что должен возвращать caller, сам не пойму.
Если разобрался, подскажи, плиз.
-
- 0
Не знаю поможет ли кому-нибудь, но вот рабочий вариант. Вообще насколько я могу сейчас говорить по своему опыту, ну экстеншены практически вообще не нужны. Макросы, фильтры, глобальные функции покрывают 98% задач.
class MediaExtension(Extension): tags = ['media'] def parse(self, parser): stream = parser.stream tag = stream.next() args=[] fpath = parser.parse_expression() if parser.stream.skip_if('comma'): flags = parser.parse_expression() else: flags = nodes.Const(None) lineno = stream.current.lineno url = _media(fpath.value, flags.value) return nodes.Output([nodes.Const(url)]) def _absolute_url(url): if url.startswith('http://') or url.startswith('https://'): return url domain = Site.objects.get_current().domain return 'http://%s%s' % (domain, url) def _media(filename, flags=''): flags = set(f.strip() for f in flags.split(',')) if flags else u'' url = urlparse.urljoin(settings.MEDIA_URL, filename.replace('dev', 'min')) if getattr(settings, 'PRODUCTION', True) is True else urlparse.urljoin(settings.MEDIA_URL, filename) if 'absolute' in flags and getattr(settings, 'ABSOLUTE_URLS', True): url= _absolute_url(url) if (filename.endswith('.css') or filename.endswith('.js')) and 'no-timestamp' not in flags and \ (getattr(settings, 'PRODUCTION', True) is not True): fullname = os.path.abspath(os.path.join(settings.MEDIA_ROOT, filename)) if os.path.exists(fullname): url += '?%d' % os.path.getmtime(fullname) return url