2014-04-19 16 views
5

Sunum yaparken şablon içeriğine erişebilen bir Jinja2 Uzantısı yazmak mümkün mü? Bir içerik değişkenine erişen ve bu değişkene dayanan bazı verileri çıkaran bir uzantı yazmak istiyorum. Böyle bir uzantının nasıl yazılacağı konusunda yeterli bilgi bulamadım. Ben somehow_get_variable() olmadığından ben NameError alabileceğimi düşündüm İçeriğe Erişimi Olan Jinja Eklentisi

SyntaxError at/
invalid syntax (foo.jinja, line 7) 

olsun foo.jinja

<!DOCTYPE html> 
<html> 
    <body> 
     <h1>This is a Test</h1> 
     {% csrf %} 
    </body> 
</html> 

yılında,

class CsrfExtension(jinja2.ext.Extension): 
    r""" Adds a {% csrf %} tag to Jinja. """ 

    tags = set(['csrf']) 
    template = '<input type="hidden" name="csrfmiddlewaretoken" value="%s">' 

    def parse(self, parser): 
     token = next(parser.stream) 
     lineno = token.lineno 
     return self.call_method('_render_csrf', lineno=lineno) 

    def _render_csrf(self, value, name, *args, **kwargs): 
     csrf_token = somehow_get_variable('csrf_token') 
     return jinja2.Markup(self.template % csrf_token) 

Ama:

Şu anda, bu var tanımladı. B) Değişkeni mevcut içerikten nasıl alacağımızı ve b) Uzantının doğru bir şekilde nasıl yazılacağını bilmek zorundayım.

Ayrıca, neden 7 hat? {% csrf %} etiketi satır 5'tedir. 'u {% csrf %} etiketinde yalnızca bir satıra sahip olmama rağmen, satır 7 yazıyor.

cevap

7

Bulunamadı. Jinja, Jinja AST'den (?) Python kodu oluşturuyor ve bu dönüştürme başarısız oldu, dolayısıyla SyntaxError'a neden oldu. Oluşturma Bağlamı almak için jinja2.nodes.ContextReference() kullanılabilir.

class CsrfExtension(jinja2.ext.Extension): 
    r""" Adds a {% csrf %} tag to Jinja. """ 

    tags = set(['csrf', 'csrf_token']) 
    template = u'<input type="hidden" name="csrfmiddlewaretoken" value="%s">' 

    def parse(self, parser): 
     lineno = next(parser.stream).lineno 
     ctx_ref = jinja2.nodes.ContextReference() 
     node = self.call_method('_render_csrf', [ctx_ref], lineno=lineno) 
     return jinja2.nodes.CallBlock(node, [], [], [], lineno=lineno) 

    def _render_csrf(self, context, caller): 
     csrf_token = context['csrf_token'] 
     return jinja2.Markup(self.template % unicode(csrf_token)) 

csrf = CsrfExtension 
İlgili konular