•  
  • 0
  •  
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?

jinja2, python, extensions.
спросил 855 дней назад Аватор пользователя Alexandr Alexandr
313 15
изменил 422 дня назад Аватор пользователя tc tc
718 15
300

3 ответа:

    •  
    • 0
    •  

    Я бы посоветовал сходить на курсы по программированию, выбрав их на портале Бизнес-обучение в Екатеринбурге

    ответил позавчера Аватор пользователя richi richi
    30
    •  
    • 0
    •  

    parser возвращает одну или несколько (list) нод. А вот что должен возвращать caller, сам не пойму.

    Если разобрался, подскажи, плиз.

    ответил 520 дней назад Аватор пользователя alexdanilov alexdanilov
    30
    •  
    • 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
    
    
    
    ответил 520 дней назад Аватор пользователя Alexandr Alexandr
    313 15
Чтобы написать ответ, вы должны авторизироваться.