python - मैं फ्लास्क सजावट से जिंज टेम्पलेट में चर कैसे भेज सकता हूं?




templates flask (2)

मेरे ब्लूप्रिंटेड फ्लास्क ऐप के आस-पास के कई मार्गों को जिन्जा को 'साइडबार डेटा' भेजने की आवश्यकता होगी।

मैं ऐसा करने का सबसे प्रभावी तरीका ढूंढ रहा हूं। उन्हें अपने 'gener_sidebar_data ()' फ़ंक्शन को प्रत्येक ब्लूप्रिंट में आयात करने से बेहतर कुछ होना चाहिए, बार-बार कह रहा है:

var1, var2, var3 = generate_sidebar_data()

और फिर उन्हें 'render_template' के साथ भेजना:

return render_template('template.html',
                           var1=var1,
                           var2=var2,
                           var3=var3
                      )

मैं इसे एक सजावटी चाहता हूं कि मैं मार्ग के साथ रख सकूं जो उपरोक्त काम करता है (कार्य चलाएं और युद्धों को जिन्जा भेजें) लेकिन मुझे नहीं पता कि यह संभव है या नहीं। आप सजावट समारोह के अंदर से जिन्जा को चर कैसे भेजते हैं?

@blueprint.route('/')
@include_sidebar_data
def frontpage():

    return render_template('template.html')

आप इस तरह एक सजावटी समारोह बना सकते हैं:

def include_sidebar_data(fn):
    template_name = fn()
    var1, var2, var3 = generate_sidebar_data()
    def wrapped():
        return render_template(template_name, var1=var2, var2=var2)
    return wrapped

@blueprint.route('/')
@include_sidebar_data
def frontpage():

    return 'template.html'

आप एक संदर्भ प्रोसेसर ( http://flask.pocoo.org/docs/api/#flask.Flask.context_processor ) का उपयोग कर सकते हैं:

def include_sidebar_data(fn):
    @blueprint.context_processor
    def additional_context():
        # this code work if endpoint equals to view function name
        if request.endpoint != fn.__name__:
            return {} 
        var1, var2, var3 = generate_sidebar_data()
        return {
            'var1': var1,
            'var2': var2,
            'var3': var3,
        }
    return fn


@blueprint.route('/')
@include_sidebar_data
def frontpage():
    return render_template('template.html')

यूपीडी: मुझे अगले उदाहरण को और अधिक पसंद है और यह बेहतर है कि सजावट का उपयोग कई दृश्य कार्यों के लिए किया जाता है:

sidebar_data_views = []


def include_sidebar_data(fn):
    sidebar_data_views.append(fn.__name__)
    return fn


@blueprint.context_processor
def additional_context():
    # this code work if endpoint equals to view function name
    if request.endpoint not in sidebar_data_views:
        return {} 
    var1, var2, var3 = generate_sidebar_data()
    return {
        'var1': var1,
        'var2': var2,
        'var3': var3,
    }


@blueprint.route('/')
@include_sidebar_data
def frontpage():
    return render_template('template.html')




jinja2