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




templates flask decorator jinja2 (4)

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

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'

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

मैं ऐसा करने का सबसे प्रभावी तरीका ढूंढ रहा हूं। उन्हें अपने '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')

आप एक संदर्भ प्रोसेसर ( 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')

मैं एक सजावटी या टेम्पलेट विधि या उसके जैसा कुछ भी उपयोग करने से कुछ भी सरल प्रस्ताव देने जा रहा हूं:

def render_sidebar_template(tmpl_name, **kwargs):
    (var1, var2, var3) = generate_sidebar_data()
    return render_template(tmpl_name, var1=var1, var2=var2, var3=var3, **kwargs)

हाँ, बस एक समारोह। आपको बस इतना ही चाहिए, है ना? प्रेरणा के लिए this फ्लास्क स्निपेट देखें। यह अनिवार्य रूप से एक अलग संदर्भ में, वही प्रकार की चीज कर रहा है।


एक नींद generator साथ थोड़ा मज़ा।

सवाल समय विलंब के बारे में है। यह निश्चित समय हो सकता है, लेकिन कुछ मामलों में हमें पिछली बार मापा गया देरी की आवश्यकता हो सकती है। यहां एक संभावित समाधान है:

आखिरी बार से मापा विलंब (नियमित रूप से जागना)

स्थिति हो सकती है, हम नियमित रूप से यथासंभव कुछ करना चाहते हैं और हम अपने अंतिम कोड के सभी last_time , next_time सामग्री से परेशान नहीं होना चाहते हैं।

बुजर जनरेटर

निम्न कोड ( sleepy.py ) एक buzzergen जनरेटर को परिभाषित करता है:

import time
from itertools import count

def buzzergen(period):
    nexttime = time.time() + period
    for i in count():
        now = time.time()
        tosleep = nexttime - now
        if tosleep > 0:
            time.sleep(tosleep)
            nexttime += period
        else:
            nexttime = now + period
        yield i, nexttime

नियमित buzzergen का आह्वान

from sleepy import buzzergen
import time
buzzer = buzzergen(3) # Planning to wake up each 3 seconds
print time.time()
buzzer.next()
print time.time()
time.sleep(2)
buzzer.next()
print time.time()
time.sleep(5) # Sleeping a bit longer than usually
buzzer.next()
print time.time()
buzzer.next()
print time.time()

और इसे चलाना हम देखते हैं:

1400102636.46
1400102639.46
1400102642.46
1400102647.47
1400102650.47

हम इसे सीधे लूप में भी इस्तेमाल कर सकते हैं:

import random
for ring in buzzergen(3):
    print "now", time.time()
    print "ring", ring
    time.sleep(random.choice([0, 2, 4, 6]))

और इसे चलाना हम देख सकते हैं:

now 1400102751.46
ring (0, 1400102754.461676)
now 1400102754.46
ring (1, 1400102757.461676)
now 1400102757.46
ring (2, 1400102760.461676)
now 1400102760.46
ring (3, 1400102763.461676)
now 1400102766.47
ring (4, 1400102769.47115)
now 1400102769.47
ring (5, 1400102772.47115)
now 1400102772.47
ring (6, 1400102775.47115)
now 1400102775.47
ring (7, 1400102778.47115)

जैसा कि हम देखते हैं, यह बजर बहुत कठोर नहीं है और हम नियमित नींद के अंतराल के साथ पकड़ने की इजाजत देते हैं भले ही हम सोते हैं और नियमित शेड्यूल से बाहर निकलते हैं।





python templates flask decorator jinja2