টেমপ্লেট ফাইল বিদ্যমান থাকলেও ফ্লাস্ক টেম্পলেটনটফাউন্ড ত্রুটি উত্থাপন করে


111

আমি ফাইলটি রেন্ডার করার চেষ্টা করছি 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

উত্তর:


221

আপনার টেম্পলেট ফাইলগুলি অবশ্যই সঠিক স্থানে তৈরি করতে হবে; 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')

ব্লুপ্রিন্টগুলি তাদের নিজস্ব টেম্পলেট ডিরেক্টরিগুলিও নিবন্ধভুক্ত করতে পারে তবে লজিক্যাল ইউনিটগুলিতে কোনও বৃহত প্রকল্পকে বিভক্ত করা সহজ করার জন্য যদি আপনি নীলনকশা ব্যবহার করছেন তবে এটির প্রয়োজন হয় না। মূল ফ্লাস্ক অ্যাপ্লিকেশন টেম্পলেট ডিরেক্টরিটি সর্বদা প্রথম ব্লুপ্রিন্টে অতিরিক্ত পাথ ব্যবহার করার সময়ও অনুসন্ধান করা হয়।


4
টেমপ্লেটগুলির চারপাশে পথের সমস্যাগুলি ডিবাগ করার জন্য EXPLAIN_TEMPLATE_LOADING খুব দরকারী। এছাড়াও, আপনি যদি ব্লুপ্রিন্ট ব্যবহার করেন তবে নিশ্চিত হয়ে নিন যে আপনি প্রতি-ব্লুপ্রিন্টের জন্য template_folderপথ নির্ধারণ করেছেন ।
জাস্টিন ক্রাউস

4
@ জাস্টিনক্রাউজ: EXPLAIN_TEMPLATE_LOADINGপ্রাথমিকভাবে এই উত্তরটি লেখার পরে তাদের জন্য ধন্যবাদ, যুক্ত করা হয়েছিল।
মার্টিজন পিটারস

4
আমার স্থানীয় ফ্লাস্কের মতো মনে হচ্ছে (উইন্ডোজে) ভিতরে টেমপ্লেট সন্ধান করতে পারে ./Templates/index.html, তবে আমি যখন হিরকুতে নিযুক্ত করি (ভেবেছিলাম এটি একই পাইথন, একই ফ্লাস্ক সংস্করণ সহ একই গ্রন্থাগারের সংস্করণ; তবে হিরকু ইউনিক্স); এবং TemplateNotFoundত্রুটি ছুড়ে ; আমি ফোল্ডারটির নাম পরিবর্তন করার পরে git mv Templates/index.html templates/index.html, স্থানীয় (উইন্ডোজ) এবং হিরকু (ইউনিক্স) উভয় সংস্করণ কাজ করেছিল
দ্য রেড মটর

4
@TheRedPea হ্যাঁ, কারণ উইন্ডোজ ফাইল সিস্টেম কেস Templates== কে ভাঁজ করে templates। তবে হেরোকু লিনাক্স চালায়, কেস সেনসিটিভ ফাইল সিস্টেম।
মার্টিজন পিটারস

13

আমি মনে করি ফ্লাস্ক ডিরেক্টরি টেম্পলেটগুলি ডিফল্টরূপে ব্যবহার করে। সুতরাং আপনার কোডটি মনে করা উচিত এটি হ্যালো.পি

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

এছাড়াও আপনি হোম এইচটিএমএল এবং সম্পর্কে এইচটিএমএল নামে দুটি এইচটিএমএল ফাইল তৈরি করেছেন এবং সেই ফাইলগুলি টেম্পলেট ফোল্ডারে রেখেছেন।


8

(দয়া করে নোট করুন ফাইল / প্রকল্পের কাঠামোর জন্য প্রদত্ত উপরোক্ত গৃহীত উত্তরগুলি একেবারে সঠিক)

এছাড়াও ..

প্রকল্পের ফাইল কাঠামোটি সঠিকভাবে সেটআপ করার পাশাপাশি, ডিরেক্টরি বংশোদ্ভূতির যথাযথ স্তরের সন্ধানের জন্য আমাদের ফ্লাস্ককে বলতে হবে।

উদাহরণ স্বরূপ..

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

../একটি ডিরেক্টরি পিছনে সরানো দিয়ে শুরু করে সেখানে শুরু হয়।

থেকে শুরু করে ../../প্যাচসমূহ দুই ডিরেক্টরি পিছন সেখানে শুরু হয় (ইত্যাদি ...)।

আশাকরি এটা সাহায্য করবে


5

আমি জানি না কেন তবে এর পরিবর্তে আমাকে নিম্নলিখিত ফোল্ডার কাঠামোটি ব্যবহার করতে হয়েছিল। আমি "টেম্পলেটগুলি" এক স্তর উপরে রেখেছি।

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

এটি সম্ভবত অন্য কোথাও একটি ভুল কনফিগারেশনের ইঙ্গিত দেয়, তবে এটি কী এবং এটি কী কাজ করেছিল তা আমি বুঝতে পারি না।


3

যে পরীক্ষা:

  1. টেম্পলেট ফাইলটির সঠিক নাম রয়েছে
  2. টেমপ্লেট ফাইলটি একটি উপ-ডিরেক্টরিতে থাকে called templates
  3. আপনি যে নামটি পাস করবেন render_templateসেটি টেম্পলেট ডিরেক্টরি সম্পর্কিত (টেম্পলেট ডিরেক্টরিতে index.htmlসরাসরি এটি টেমপ্লেট ডিরেক্টরিতে auth/login.htmlলেখক ডিরেক্টরিতে থাকবে))
  4. হয় হয় আপনার অ্যাপ্লিকেশন হিসাবে একই নামের একটি উপ-ডিরেক্টরি নেই বা টেম্পলেট ডিরেক্টরি সেই সাবডিরের ভিতরে রয়েছে inside

যদি এটি কাজ না করে তবে ডিবাগিং চালু করুন ( app.debug = True) যা ভুল তা খুঁজে পেতে সহায়তা করতে পারে।


3

আপনি যদি কোনও ইনস্টলড প্যাকেজ থেকে আপনার কোড চালনা করেন তবে নিশ্চিত হন যে টেমপ্লেট ফাইলগুলি ডিরেক্টরিতে উপস্থিত রয়েছে <python root>/lib/site-packages/your-package/templates


কিছু বিশদ:

আমার ক্ষেত্রে আমি ফ্ল্যাশ_সিম্পল_উই প্রকল্পের উদাহরণগুলি চালানোর চেষ্টা করছিলাম এবং jinjaসর্বদা বলব

jinja2.exferences.TemplateNotFound: form.html

কৌশলটি ছিল যে নমুনা প্রোগ্রামটি ইনস্টল করা প্যাকেজটি আমদানি করবে flask_simple_ui। এবং ninjaসেই প্যাকেজের অভ্যন্তর থেকে ব্যবহার করা প্যাকেজটির পথটি অনুসন্ধানের জন্য রুট ডিরেক্টরি হিসাবে ব্যবহার করা হচ্ছে, আমার ক্ষেত্রে ...python/lib/site-packages/flask_simple_uiএটির পরিবর্তে os.getcwd() যা প্রত্যাশা করা হবে।

আমার দুর্ভাগ্যক্রমে, setup.pyএকটি বাগ রয়েছে এবং অনুপস্থিত সহ কোনও এইচটিএমএল ফাইল অনুলিপি করে না form.html। একবার আমি স্থির করে ফেললে setup.py, টেমপ্লেট নটফাউন্ডের সমস্যাটি বিলুপ্ত হয়ে গেল।

আমি আশা করি এটি কাউকে সাহায্য করবে


2

আমার একই ত্রুটিটি ছিল যে আমি কেবল ভুল করেছিলাম তা হল আমার 'টেম্পলেট' ফোল্ডারটির নাম রাখা, 'টেমপ্লেট' 's' ছাড়াই। এটি কার্যকরভাবে পরিবর্তিত হওয়ার পরে, কেন এটি জিনিস তা জানেন না।


2

যখন রেন্ডার_টেমপ্লেট () ফাংশন ব্যবহৃত হয় তখন এটি টেমপ্লেট নামক ফোল্ডারে টেম্পলেট অনুসন্ধান করার চেষ্টা করে এবং এটি ত্রুটি jinja2.exferences নিক্ষেপ করে।

  1. এইচটিএমএল ফাইল উপস্থিত নেই বা
  2. যখন টেমপ্লেট ফোল্ডার উপস্থিত না থাকে

সমস্যাটি সমাধান করতে :

পাইথন ফাইলটি যেখানে অবস্থিত সেখানে ডিরেক্টরি টেম্পলেটগুলির সাথে একটি ফোল্ডার তৈরি করুন এবং টেমপ্লেট ফোল্ডারে তৈরি করা এইচটিএমএল ফাইল রাখুন।


1

আপনার অজগর মডিউলের পাশেই আপনার সমস্ত .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)

0

আমার সমস্যাটি হ'ল আমি যে ফাইলটি আমার ভিতরে থেকে উল্লেখ করছি তা home.htmlহ'ল তার .j2পরিবর্তে .htmlএবং আমি যখন এটি পরিবর্তন করেছি তখন জিনজা এটি পড়তে পারে।

বোকা ত্রুটি তবে এটি কারওর পক্ষে সহায়তা করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.