2012-09-05 13 views
16

मेरे पास लिखे गए कुछ दर्जन कस्टम फ़िल्टर के साथ एक jinja_filters.py फ़ाइल है। अब मेरे पास एकाधिक फ्लास्क ऐप्स हैं जिन्हें इन फ़िल्टरों का उपयोग करने की आवश्यकता है। (मुझे यकीन है कि अगर मेरी समस्या बोतल विशेष या नहीं है नहीं कर रहा हूँ।)किसी अन्य फ़ाइल से कस्टम jinja2 फ़िल्टर कैसे आयात करें (और फ्लास्क का उपयोग करके)?

पूरा करने के लिए जो मैं चाहता

एक hacky तरीके से करना है:

app = Flask(__name__) 

import jinja_filters 

@app.template_filter('filter_name1') 
def filter_name1(arg): 
    return jinja_filters.filter_name1(arg) 

@app.template_filter('filter_name2') 
def filter_name2(arg): 
    return jinja_filters.filter_name2(arg) 

... 

"सही" तरीका यह है क्या है?

संपादित करें: आदर्श रूप से, मुझे प्रत्येक फ़िल्टर नाम सूचीबद्ध नहीं करना होगा। तो जब मैं jinja_filters.py में एक नया फ़िल्टर जोड़ता हूं तो मुझे किसी अन्य कोड को अपडेट करने की आवश्यकता नहीं है - मेरे सभी ऐप्स तुरंत इसका उपयोग करने में सक्षम होंगे।

उत्तर

25

जहां भी आप अपना ऐप ऑब्जेक्ट सेट कर रहे हैं (APP.py, शायद), आपको केवल अपने कस्टम फ़िल्टर आयात करने और फिर जिन्जा पर्यावरण विशेषता को संशोधित करने की आवश्यकता है।

import jinja_filters 

app = Flask(__name__) 
app.jinja_env.filters['filter_name1'] = jinja_filters.filter_name1 
app.jinja_env.filters['filter_name2'] = jinja_filters.filter_name2 

और इसी तरह।

एक और संभावना है इसलिए जैसे jinja_filters में सभी तरीकों को खोजने के लिए inspect मॉड्यूल का उपयोग करने के लिए है:

from inspect import getmembers, isfunction 
import jinja_filters 

app = Flask(__name__) 

my_filters = {name: function 
       for name, function in getmembers(jinja_filters) 
       if isfunction(function)} 

app.jinja_env.filters.update(my_filters) 

कि कोड अपरीक्षित है, लेकिन विचार फ़ंक्शन नाम और कार्यों का एक शब्दकोश है कि में मौजूद का निर्माण करना है आपकी jinja_filters फ़ाइलें और फिर अपने फ़िल्टर के साथ Jinja पर्यावरण के फ़िल्टर शब्दकोश को अद्यतन करें।

+0

यह मेरे पास जो कुछ है उससे निश्चित रूप से बेहतर है। लेकिन क्या कोई तरीका है कि मुझे स्पष्ट रूप से प्रत्येक फ़िल्टर नाम की सूची नहीं है? –

+0

मैंने अपने उत्तर को एक और समाधान के साथ अपडेट किया जो 'इंस्पेक्ट 'मॉड्यूल का उपयोग करके फ़िल्टर को गतिशील रूप से जोड़ सकता है। – aezell

+1

ठीक है, यह काम ठीक से हो जाता है :) लेकिन मैं अभी भी विश्वास नहीं कर सकता कि जिनजा 2/फ्लास्क के लेखकों के पास ऐसा करने का एक और संक्षिप्त तरीका नहीं था। (यदि कोई और कोई झुकता है तो मैं आपके उत्तर को दो दिनों में चेकमार्क कर दूंगा।) –

28

Flask blueprints का उपयोग करके ऐसा करने का एक अनुशंसित तरीका है।

  • ब्लूप्रिंट के माध्यम से टेम्पलेट फिल्टर, स्टैटिक फ़ाइलें, टेम्पलेट्स, और अन्य उपयोगिताओं प्रदान करें: यह उपयोग के मामलों में से एक विशेष रूप से इस कार्यक्षमता है। ब्लूप्रिंट को अनुप्रयोगों को लागू करने या कार्यों को देखने की आवश्यकता नहीं होती है।

तुम सिर्फ एक flask.Blueprint वस्तु बना सकते हैं और के रूप में आप flask.Flask एप्लिकेशन वस्तु के साथ होता है एक समान तरीके से अपने फिल्टर रजिस्टर करने के लिए इसका इस्तेमाल करते हैं, Blueprint.app_template_filter डेकोरेटर या Blueprint.add_app_template_filter विधि का उपयोग करने की आवश्यकता है।

# filters.py 

import jinja2 
import flask 

blueprint = flask.Blueprint('filters', __name__) 

# using the decorator 
@jinja2.contextfilter 
@blueprint.app_template_filter() 
def filter1(context, value): 
    return 1 

# using the method 
@jinja2.contextfilter 
def filter2(context, value): 
    return 2 

blueprint.add_app_template_filter(filter2) 

तो फिर तुम सिर्फ़ अपने ऐप्लिकेशन वस्तु पर खाका रजिस्टर करने की आवश्यकता:

# app.py 

import flask 
import filters 

app = flask.Flask(__name__) 
app.register_blueprint(filters.blueprint) 

और देखा, फिल्टर पंजीकृत हैं।