2014-02-14 12 views
6

Ich habe ein Makro, das verwendet wird, um ein lokales Repository mit debmirror zu erstellen.Wie erhebe ich eine Ausnahme in einem Jinja2-Makro?

Hier ist der Code-Snippet ist:

{%- set gnupghome = kwargs.pop('gnupghome', '/root/.gnupg') %} 
{%- set env = { 'GNUPGHOME': gnupghome } %} 
keyring_import: 
    cmd: 
    - run 
{%- if 'keyid' in kwargs and 'keyserver' in kwargs %} 
    {%- set keyid = kwargs.pop('keyid') %} 
    {%- set keyserver = kwargs.pop('keyserver') %} 
    - name: 'gpg --no-default-keyring --keyring {{ gnupghome }}/trustedkeys.gpg --keyserver {{ keyserver }} --recv-keys {{ keyid }}' 
{%- elif 'key_url' in kwargs %} 
    {%- set key_url = kwargs.pop('key_url') %} 
    - name: 'wget -q -O- "{{ key_url }}" | gpg --no-default-keyring --keyring {{ gnupghome }}/trustedkeys.gpg --import' 
{%- endif %} 
    - require: 
     - pkg: wget 
     - pkg: gnupg 

Am endif Stichwort, würde Ich mag else verwenden, um eine Ausnahme, für zB zu erhöhen:

Entweder key_url oder beide Keyserver und KeyID erforderlich .

Ist es möglich?

+3

Nein, Jinja2 keine Ausnahmen Anhebung nicht unterstützt. Sie können Python-Funktionen oder Filter verwenden, die Ausnahmen auslösen können, aber nicht in reinem Jinja. –

Antwort

4

Dies kann in einer Erweiterung behandelt werden. Von https://github.com/duelafn/python-jinja2-apci

# FROM: https://github.com/duelafn/python-jinja2-apci/blob/master/jinja2_apci/error.py 
from jinja2 import nodes 
from jinja2.ext import Extension 
from jinja2.exceptions import TemplateRuntimeError 

class RaiseExtension(Extension): 
    # This is our keyword(s): 
    tags = set(['raise']) 

    # See also: jinja2.parser.parse_include() 
    def parse(self, parser): 
     # the first token is the token that started the tag. In our case we 
     # only listen to "raise" so this will be a name token with 
     # "raise" as value. We get the line number so that we can give 
     # that line number to the nodes we insert. 
     lineno = next(parser.stream).lineno 

     # Extract the message from the template 
     message_node = parser.parse_expression() 

     return nodes.CallBlock(
      self.call_method('_raise', [message_node], lineno=lineno), 
      [], [], [], lineno=lineno 
     ) 

    def _raise(self, msg, caller): 
     raise TemplateRuntimeError(msg) 

Übergeben Sie die Erweiterung Ihrer Umgebung: jinja2.Environment(... extensions=[RaiseExtension]) es dann in der Vorlage verwenden:

{%- if 'keyid' in kwargs and 'keyserver' in kwargs %} 
    ... 
{%- else %} 
    {% raise "Either key_url or both keyserver and keyid required." %} 
{% endif %} 
1

Dean Serenevy Antwort elegant ist. Hier ist eine kürzere Lösung, die der Umgebung von jinja eine globale Dimension hinzufügt.

def raise_helper(msg): 
    raise Exception(msg) 

env = jinja2.Environment(... 
env.globals['raise'] = raise_helper 

Dann in Ihrer Vorlage:

{{ raise("uh oh...") }} 
6

extrem schnelle Abhilfe, solange Sie keine ZeroDivisionError Erhöhung nichts dagegen:

Legen Sie eine {{ 0/0 }} wo immer Sie eine Ausnahme erhöhen möchten.

3

Fügen Sie einen Ausdruck {{ "My error explained here"/0 }} ein. z.B.

{% if not required_parameter %} 
{{ "required_parameter must be defined."/0 }} 
{% endif %} 

(baut auf Antwort des zsero von 0/0)