سؤال

لقد وجدت حتى الآن أنه من المستحيل إنتاج Tracebacks القابلة للاستخدام عندما لا يتم ترميز قوالب Mako بشكل صحيح.

هل هناك أي طريقة لتصحيح القوالب إلى جانب التكرار لكل سطر التعليمات البرمجية؟

هل كانت مفيدة؟

المحلول

ماكو يوفر فعلا طريقة لطيفة جدا لتعقب الأخطاء في قالب:

from mako import exceptions

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

نصائح أخرى

أنظر إلى قارورة ماكو المصدر، لقد وجدت معلمة تكوين غير موثقة تسمى MAKO_TRANSLATE_EXCEPTIONS.

تعيين هذا False في Crask App Config الخاص بك وستحصل على استثناءات لطيفة فوق القالب. هذا ينجز نفس الشيء كما اقترح mmariano، دون الحاجة إلى تحرير المصدر. على ما يبدو، تمت إضافة هذه المعلمة بعد إجابة ماريانو.

أنا كسرها إلى قطع، ثم إعادة تجميع القطع عندما وجدت المشكلة.

ليست جيدة، ولكن من الصعب حقا معرفة ما الخطأ الذي حدث في قالب كبير ومعقد.

باستخدام Flask_Mako، أجد أنه من الأسهل تخطي جيل TemplateError وفقط الاستثناء. أي في flask_mako.py، تعليق الجزء الذي يجعل templateError ويفعل مجرد رفع:

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

}

ثم سترى استثناء بيثون منتظم تسبب في المشكلة مع أرقام الخطوط في القالب.

الجمع بين اثنين من إجابات أفضل مع صلصة خاصة الخاصة بي:

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

يلف المخزون "render_template" وظيفة:

  • قبض على الاستثناءات، و
    • إذا قام بتصحيح الأخطاء، فقم بتقديم نسخة خلفية
    • إن لم يكن تصحيح الأخطاء، ارفع الاستثناء مرة أخرى حتى يتم تسجيله
  • جعل التكوين يمكن الوصول إليه من الصفحة (غير ذي صلة)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top