2012-11-28 10 views
33

डिफ़ॉल्ट कुप्पी से टेम्पलेट फ़ाइलों "टेम्पलेट" निर्देशिका में संग्रहीत उपयोग करता है:फ्लास्क में उपयोग करने के लिए गतिशील रूप से टेम्पलेट निर्देशिका का चयन कैसे करें?

/flaskapp 
    /application.py 
    /templates 
     /hello.html 

वहाँ किसी भी तरह से गतिशील रूप से उपयोगकर्ता के प्रवेश के अनुसार टेम्पलेट निर्देशिका का चयन करने के है? इस तरह मैं निर्देशिका संरचना होना चाहता हूँ:

/flaskapp 
    /application.py 
    /templates (default template goes here) 
     /hello.html 
    /userdata 
     /user1 
      /template1 
       hello.html 
      /template2 
       hello.html 
     /user2 
      /template1 
       hello.html 
      /template2 
       hello.html 

अब अगर मैं उपयोगकर्ता द्वारा प्रवेश के लिए उपयोगकर्ता नाम और उपयोगकर्ता द्वारा सक्रिय टेम्पलेट का नाम है, यह गतिशील निर्देशिका टेम्पलेट फ़ाइलों को लोड करने का चयन करने के लिए संभव है? उदाहरण के लिए,

/userdata/<username>/<activated template name>/ 

बजाय

/templates/ 

क्या मैं प्राप्त करने के लिए कोशिश कर रहा हूँ मेरी वेब अनुप्रयोग उपयोगकर्ताओं ने अपनी वेबसाइट के लिए चयन विषयों अपलोड कर सकते हैं जहां/के लिए विषय प्रणाली की तरह एक वर्डप्रेस है तय की।

उत्तर

31

वहाँ भी संभावना जिंजा लोडर के ऊपर लिख और रास्तों जहां जिंजा टेम्पलेट्स के लिए दिखेगा स्थापित करने के लिए है:

तो जैसा ...

Flask(__name__, template_folder="wherever") 

यहाँ प्रलेखन है। पसंद:

my_loader = jinja2.ChoiceLoader([ 
     app.jinja_loader, 
     jinja2.FileSystemLoader(['/flaskapp/userdata', 
           '/flaskapp/templates']), 
    ]) 
app.jinja_loader = my_loader 

निर्देशों को उस क्रम में व्यवस्थित किया जाता है जहां जिन्जा को इसकी तलाश शुरू करने की आवश्यकता होती है। तो देखने से आप इस तरह उपयोगकर्ता विशिष्ट टेम्पलेट प्रदान कर सकते हैं:

render_template('%s/template1/hello.html' % username) 

जहां उपयोगकर्ता नाम आप dinamically ध्यान में रखते हुए बदल सकते हैं। बेशक आप यह भी चुन सकते हैं कि प्रस्तुत करने के लिए कौन सा टेम्पलेट (1 या 2) चुनें। लेकिन मूल रूप से जो आप वास्तव में याद करते हैं वह कस्टम पथ के साथ इस कस्टम Jinja लोडर है।

आशा है कि मदद की या विचारों :)

+5

आपको सूचियों या डिक्ट्स घोषणाओं के अंदर पाइथन में न्यूलाइन से बचने की ज़रूरत नहीं है। – fiatjaf

+0

यदि किसी को समस्या हो रही है: यह Heroku में काम नहीं करता है। आपको पहले '/' (जैसे '' flaskapp/userdata'') के बिना पथ पारित करना होगा। – fiatjaf

+0

यह मेरे लिए काम नहीं करता है। मदद – Kishan

55

आप फ्लास्क कन्स्ट्रक्टर को "टेम्पलेट_फोल्डर" तर्क पास कर सकते हैं। http://flask.pocoo.org/docs/api/

+0

तरह views.py करने और यह भी आप ब्लूप्रिंट उपयोग करने के लिए जा रहे हैं, वे भी कस्टम टेम्पलेट निर्देशिका भी हो सकता है दृश्य (कार्रवाई) विधियों को जोड़ने। –

0

मैं अजगर करने के लिए नया हूँ, लेकिन मैं पहले से ही इस समस्या से सामना करना पड़ा है दे दी है। अगर मेरे समाधान सही है मैं नहीं जानता, लेकिन यह काम करता है:

तुम सब application.py init बोतल ऐप्लिकेशन की प्रत्येक

/flaskapp 
    /application.py 
    /templates (default template goes here) 
     __init__.py  # default module flaskapp 
     views.py  # here you can define methods for default module (like Action in MVC) 
     /hello.html 
    /static 
    /userdata 
     /user1 
      __init__.py # user1 module 
      views.py # here you can define methods for user1 module 
      /template1 
       hello.html 
      /template2 
       hello.html 
     /user2 
      __init__.py # user2 module 
      views.py # here you can define methods for user2 module 
      /template1 
       hello.html 
      /template2 
       hello.html    

उपयोगकर्ता के लिए मॉड्यूल बनाने के लिए सबसे पहले, वैश्विक विधि render_page_from जोड़ सकते हैं और रजिस्टर ब्लूप्रिंट

app = Flask(__name__) 
def render_page_from(controller_name, template_name_or_list, **context): 
    # here you can choose any controller or use default 
    app.jinja_loader.searchpath.clear() 
    blueprint = app.blueprints[controller_name] 
    app.jinja_loader.searchpath.append(blueprint.template_folder) 
    return render_template(template_name_or_list, context=context) 

from flaskapp.user1 import controller as user1_controller 
from flaskapp.user2 import controller as user2_controller 

app.register_blueprint(user1_controller) 
app.register_blueprint(user2_controller) 

प्रत्येक मॉड्यूल में (user1, user2 आदि) init .py

templates_folder = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates') 

controller = Blueprint('user1', __name__, url_prefix='/user1', template_folder = templates_folder) 

import flaskapp.user1.views 
012 में init खाका

अंत में इस

from LocalHub.client import controller 
@controller.route('/hello') 
def hello(): 
    """Renders the page""" 
    return render_page_from(controller.name, 'hello.html', title='hello') 
संबंधित मुद्दे