Domanda

Finora ho trovato impossibile produrre traceback utilizzabili quando i modelli Mako non sono codificati correttamente.

Esiste un modo per eseguire il debug dei modelli oltre all'iterazione per ogni riga di codice?

È stato utile?

Soluzione

Mako in realtà fornisce un molto bello modo per rintracciare gli errori in un modello :

from mako import exceptions

try:
    template = lookup.get_template(uri)
    print template.render()
except:
    print exceptions.html_error_template().render()

Altri suggerimenti

Flask-Mako fonte, ho trovato un parametro di configurazione non documentato chiamato MAKO_TRANSLATE_EXCEPTIONS.

Imposta questo a False nel vostro Flask app config e si otterrà belle eccezioni zampillante dal modello. Questo compie la stessa cosa come suggerito @Mariano, senza la necessità di modificare l'origine. Apparentemente, questo parametro è stato aggiunto dopo la risposta di Mariano.

I suddividerle in pezzi, e poi ricomporre i pezzi, quando ho trovato il problema.

Non va bene, ma è davvero difficile dire che cosa è andato storto in un grande, modello complesso.

Utilizzando flask_mako, trovo che sia più facile per saltare alla generazione TemplateError e proprio lasciarsi sfuggire l'eccezione. Cioè in flask_mako.py, commentare la parte che rende il TemplateError e basta fare un rilancio:

def _render(template, context, app):
 """Renders the template and fires the signal"""
app.update_template_context(context)
try:
    rv = template.render(**context)
    template_rendered.send(app, template=template, context=context)
    return rv
except:
    #translated = TemplateError(template)                                                                                                                 
    #raise translated                                                                                                                                     
    raise

}

Poi vedrete un'eccezione pitone regolare che ha causato il problema insieme ai numeri di riga nel modello.

Combinando le due risposte principali con la mia salsa speciale:

from flask.ext.mako import render_template as render_template_1
from mako import exceptions

app.config['MAKO_TRANSLATE_EXCEPTIONS'] = False    # seems to be necessary

def render_template(*args, **kwargs):
    kwargs2 = dict(**kwargs)
    kwargs2['config'] = app.config     # this is irrelevant, but useful
    try:
        return render_template_1(*args, **kwargs2)
    except:
        if app.config.get('DEBUG'):
            return exceptions.html_error_template().render()
        raise

Comprende la funzione stock "render_template":

  • catturare eccezioni e
    • se si esegue il debug, eseguire il rendering di un backtrace
    • se non si sta eseguendo il debug, sollevare nuovamente l'eccezione in modo che venga registrata
  • rendere la configurazione accessibile dalla pagina (irrilevante)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top