फ्लास्क टेम्पलेट फ़ाइल के मौजूद होने के बावजूद टेम्प्लेटNotFound त्रुटि उठाता है


107

मैं फ़ाइल रेंडर करने की कोशिश कर रहा हूँ home.html। फ़ाइल मेरे प्रोजेक्ट में मौजूद है, लेकिन jinja2.exceptions.TemplateNotFound: home.htmlजब मैं इसे रेंडर करने की कोशिश करता हूं तो मुझे मिलता रहता है। फ्लास्क को मेरा टेम्प्लेट क्यों नहीं मिल रहा है?

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('home.html')
/myproject
    app.py
    home.html

जवाबों:


212

आपको अपनी टेम्पलेट फ़ाइलों को सही स्थान पर बनाना होगा; templatesअपने अजगर मॉड्यूल के बगल में उपनिर्देशिका में ।

त्रुटि इंगित करती है कि निर्देशिका home.htmlमें कोई फ़ाइल नहीं है templates/। सुनिश्चित करें कि आपने उस निर्देशिका को अपने अजगर मॉड्यूल के समान निर्देशिका में बनाया है, और आपने वास्तव home.htmlमें उस उपनिर्देशिका में एक फ़ाइल डाल दी है । यदि आपका ऐप एक पैकेज है, तो पैकेज के अंदर टेम्प्लेट फ़ोल्डर बनाया जाना चाहिए ।

myproject/
    app.py
    templates/
        home.html
myproject/
    mypackage/
        __init__.py
        templates/
            home.html

वैकल्पिक रूप से, यदि आपने अपने टेम्प्लेट फ़ोल्डर को इसके अलावा कुछ नाम दिया है templatesऔर इसे डिफ़ॉल्ट रूप से नाम बदलना नहीं चाहते हैं, तो आप फ्लास्क को अन्य निर्देशिका का उपयोग करने के लिए कह सकते हैं।

app = Flask(__name__, template_folder='template')  # still relative to module

आप फ्लास्क से पूछ सकते हैं कि यह समझाने के लिए कि उसने EXPLAIN_TEMPLATE_LOADINGविकल्प को सेट करके कैसे किसी दिए गए टेम्पलेट को खोजने की कोशिश की True। लोड किए गए प्रत्येक टेम्प्लेट के लिए, आपको स्तर पर, फ्लास्क मेंapp.logger लॉग इन की रिपोर्ट मिलेगी INFO

जब कोई खोज सफल होती है तो यही दिखता है; इस उदाहरण में foo/bar.htmlटेम्प्लेट टेम्पलेट को बढ़ाता है base.html, इसलिए दो खोजें हैं:

[2019-06-15 16:03:39,197] INFO in debughelpers: Locating template "foo/bar.html":
    1: trying loader of application "flaskpackagename"
       class: jinja2.loaders.FileSystemLoader
       encoding: 'utf-8'
       followlinks: False
       searchpath:
         - /.../project/flaskpackagename/templates
       -> found ('/.../project/flaskpackagename/templates/foo/bar.html')
[2019-06-15 16:03:39,203] INFO in debughelpers: Locating template "base.html":
    1: trying loader of application "flaskpackagename"
       class: jinja2.loaders.FileSystemLoader
       encoding: 'utf-8'
       followlinks: False
       searchpath:
         - /.../project/flaskpackagename/templates
       -> found ('/.../project/flaskpackagename/templates/base.html')

ब्लूप्रिंट अपने स्वयं के टेम्प्लेट निर्देशिकाओं को भी पंजीकृत कर सकते हैं, लेकिन यह एक आवश्यकता नहीं है यदि आप ब्लूप्रिंट का उपयोग कर रहे हैं ताकि तार्किक इकाइयों में एक बड़ी परियोजना को विभाजित करना आसान हो सके। मुख्य फ्लास्क ऐप टेम्प्लेट डायरेक्टरी हमेशा ब्लूप्रिंट प्रति अतिरिक्त पथों का उपयोग करते हुए हमेशा सबसे पहले खोजी जाती है।


2
EXPLAIN_TEMPLATE_LOptions टेम्पलेट्स के चारों ओर पथ समस्याओं को दूर करने के लिए बहुत उपयोगी है। इसके अलावा, यदि आप ब्लूप्रिंट का उपयोग करते हैं, तो सुनिश्चित करें कि आपने प्रति ब्लूप्रिंटtemplate_folder पथ निर्धारित किया है ।
जस्टिन क्रूस

1
@JustinKrause: EXPLAIN_TEMPLATE_LOADINGइस उत्तर के शुरू में लिखे जाने के बाद , उन लोगों के लिए धन्यवाद जोड़ा गया।
मार्टिन पीटर्स

1
मेरे स्थानीय फ्लास्क (विंडोज पर) की तरह लगता है कि अंदर टेम्पलेट मिल सकते हैं ./Templates/index.html, लेकिन जब मैं हरोकू के लिए तैनात हूं (सोचा कि यह वही पायथन था, वही फ्लास्क संस्करण सहित समान लाइब्रेरी संस्करण; लेकिन हरोकू यूनिक्स है) और TemplateNotFoundत्रुटि फेंकता है; फ़ोल्डर का नाम बदलने के बाद, मैंने git mv Templates/index.html templates/index.htmlस्थानीय (विंडोज) और हरोकू (यूनिक्स) दोनों संस्करणों पर काम किया
रेड मटर

1
@ TheRedPea हाँ, क्योंकि Windows फ़ाइल सिस्टम तह केस Templates==templates । लेकिन हर्कोयू लिनक्स चलाता है, केस सेंसिटिव फाइल सिस्टम के साथ।
मार्टिन पीटर्स

11

मुझे लगता है कि फ्लास्क डिफ़ॉल्ट रूप से निर्देशिका टेम्प्लेट का उपयोग करता है। तो आपके कोड को मान लेना चाहिए कि यह आपका hello.py है

from flask import Flask,render_template

app=Flask(__name__,template_folder='template')


@app.route("/")
def home():
    return render_template('home.html')

@app.route("/about/")
def about():
    return render_template('about.html')

if __name__=="__main__":
    app.run(debug=True)

और आप अंतरिक्ष संरचना की तरह काम करते हैं

project/
    hello.py        
    template/
         home.html
         about.html    
    static/
           js/
             main.js
           css/
               main.css

यह भी कि आप home.html और about.html के नाम से दो html फाइलें बनायें और उन फाइलों को टेम्पलेट फोल्डर में रखें।


8

(कृपया ध्यान दें कि फ़ाइल / प्रोजेक्ट संरचना के लिए उपर्युक्त स्वीकृत उत्तर बिल्कुल सही है।)

इसके अलावा ..

प्रोजेक्ट फ़ाइल संरचना को ठीक से स्थापित करने के अलावा, हमें निर्देशिका पदानुक्रम के उचित स्तर को देखने के लिए फ्लास्क को बताना होगा।

उदाहरण के लिए..

    app = Flask(__name__, template_folder='../templates')
    app = Flask(__name__, template_folder='../templates', static_folder='../static')

के साथ शुरू ../एक निर्देशिका को पीछे की ओर ले जाने के होता है और वहां से शुरू होता है।

के साथ शुरू ../../ चाल दो निर्देशिका पीछे की ओर है और वहाँ से शुरू होता है (और इतने पर ...)।

उम्मीद है की यह मदद करेगा


4

मुझे पता नहीं क्यों, लेकिन मुझे इसके बजाय निम्नलिखित फ़ोल्डर संरचना का उपयोग करना पड़ा। मैंने "टेम्पलेट" एक स्तर ऊपर रखा।

project/
    app/
        hello.py
        static/
            main.css
    templates/
        home.html
    venv/

यह संभवतः एक गलत धारणा को कहीं और इंगित करता है, लेकिन मैं यह पता नहीं लगा सका कि यह क्या था और यह काम किया।


3

जांच करे:

  1. टेम्पलेट फ़ाइल का सही नाम है
  2. टेम्प्लेट फ़ाइल नामक एक उपनिर्देशिका में है templates
  3. वह नाम जो आप पास करते हैं render_template, जो टेम्पलेट निर्देशिका के सापेक्ष है ( index.htmlसीधे टेम्पलेट निर्देशिका में होगा,auth/login.html होगा में ऑरिजनल डायरेक्टरी के अंतर्गत होगा।)
  4. आप या तो आपके ऐप के समान नाम के साथ एक उपनिर्देशिका नहीं रखते हैं, या टेम्पलेट निर्देशिका उस सबडिर के अंदर है।

यदि वह काम नहीं करता है, तो डिबगिंग ( app.debug = True) चालू करें जो यह पता लगाने में मदद कर सकता है कि क्या गलत है।


3

यदि आप एक स्थापित पैकेज से अपना कोड चलाते हैं, तो सुनिश्चित करें कि निर्देशिका में टेम्पलेट फ़ाइलें मौजूद हैं <python root>/lib/site-packages/your-package/templates


कुछ विवरण:

मेरे मामले में मैं प्रोजेक्ट फ्लास्क_सिमपल_यू के उदाहरणों को चलाने की कोशिश कर रहा था और jinjaहमेशा कहूंगा

jinja2.exception.TemplateNotFound: form.html

चाल यह थी कि नमूना कार्यक्रम स्थापित पैकेज को आयात करेगा flask_simple_ui। और ninjaउस पैकेज के अंदर से उपयोग किया जा रहा है, पैकेज पथ को देखने के लिए रूट निर्देशिका के रूप में उपयोग कर रहा है, मेरे मामले में ...python/lib/site-packages/flask_simple_ui, बजाय os.getcwd() एक की अपेक्षा करेगा।

मेरे दुर्भाग्य के लिए, setup.pyएक बग है और लापता सहित किसी भी HTML फ़ाइलों की प्रतिलिपि नहीं करता है form.html। एक बार मैंने तय किया setup.py, TemplateNotFound के साथ समस्या गायब हो गई।

मुझे उम्मीद है कि यह किसी की मदद करता है।


2

मेरे पास एक ही त्रुटि थी, केवल एक चीज जो मैंने गलत की थी, वह थी अपने 'टेम्प्लेट' फ़ोल्डर, 'टेम्प्लेट' को 's' के बिना नाम देना। यह बदलने के बाद कि यह ठीक काम करता है, न जाने क्यों इसकी बात है लेकिन यह है।


2

जब रेंडर_template () फ़ंक्शन का उपयोग किया जाता है, तो यह टेम्पलेट नामक फ़ोल्डर में टेम्पलेट की खोज करने की कोशिश करता है और यह त्रुटि jinja2.exception.TemplateNotFound को फेंकता है जब:

  1. html फ़ाइल मौजूद नहीं है या
  2. जब टेम्पलेट फ़ोल्डर मौजूद नहीं है

इस समस्या को हल करने के लिए :

उसी डायरेक्टरी में नाम टेम्प्लेट के साथ एक फोल्डर बनाएं जहां पायथन फाइल स्थित है और टेम्प्लेट फ़ोल्डर में बनाई गई HTML फाइल को रखें।


1

आपको अपने अजगर मॉड्यूल के बगल .htmlमें सभी फ़ाइलों को टेम्पलेट फ़ोल्डर में रखने की आवश्यकता है । और अगर कोई ऐसी छवियाँ हैं जो आप अपनी html फ़ाइलों में उपयोग कर रहे हैं, तो आपको अपनी सभी फ़ाइलों को स्थिर नाम के फ़ोल्डर में रखने की आवश्यकता है

निम्नलिखित संरचना में

project/
    hello.py
    static/
        image.jpg
        style.css
    templates/
        homepage.html
    virtual/
        filename.json

1

एक अन्य विकल्प यह सेट करना है root_pathजो टेम्पलेट और स्थिर फ़ोल्डर दोनों के लिए समस्या को ठीक करता है।

root_path = Path(sys.executable).parent if getattr(sys, 'frozen', False) else Path(__file__).parent
app = Flask(__name__.split('.')[0], root_path=root_path)

यदि आप सीधे टेम्प्लेट प्रस्तुत करते हैं Jinja2, तो आप लिखते हैं:

ENV = jinja2.Environment(loader=jinja2.FileSystemLoader(str(root_path / 'templates')))
template = ENV.get_template(your_template_name)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.