Flask는 템플릿 파일이 존재하더라도 TemplateNotFound 오류를 발생시킵니다.


110

파일을 렌더링하려고합니다 home.html. 파일이 내 프로젝트에 있지만 jinja2.exceptions.TemplateNotFound: home.html렌더링하려고 할 때 계속 표시됩니다. Flask가 내 템플릿을 찾을 수없는 이유는 무엇입니까?

from flask import Flask, render_template

app = Flask(__name__)

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

답변:


219

올바른 위치에 템플릿 파일을 만들어야합니다. templatesPython 모듈 옆 의 하위 디렉토리에 있습니다.

이 오류는 디렉터리에 home.html파일 이 없음을 나타냅니다 templates/. 파이썬 모듈과 동일한 디렉토리에 해당 디렉토리를 생성했는지, 실제로 home.html해당 하위 디렉토리에 파일을 넣었는지 확인하십시오 . 앱이 패키지 인 경우 패키지 내부에 템플릿 폴더를 만들어야 합니다.

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

또는 템플릿 폴더의 이름을 다른 templates이름으로 지정하고 기본값으로 이름을 바꾸고 싶지 않은 경우 Flask에 다른 디렉터리를 사용하도록 지시 할 수 있습니다.

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

EXPLAIN_TEMPLATE_LOADING옵션 을 로 설정하여 주어진 템플릿을 찾는 방법을 설명하도록 Flask에 요청할 수 있습니다 True. 로드 된 모든 템플릿 에 대해 레벨에서 Flask에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')

Blueprint는 자체 템플릿 디렉토리등록 할 수 있지만, Blueprint를 사용하여 더 큰 프로젝트를 논리 단위로 쉽게 분할 할 수있는 경우에는 필요하지 않습니다. Blueprint 당 추가 경로를 사용하는 경우에도 기본 Flask 앱 템플릿 디렉터리가 항상 먼저 검색됩니다.


2
EXPLAIN_TEMPLATE_LOADING 은 템플릿과 관련된 경로 문제를 디버그하는 데 매우 유용합니다. 또한 블루 프린트를 사용하는 경우 블루 프린트 template_folder 경로 를 설정해야합니다 .
Justin Krause

1
@JustinKrause : 감사합니다 EXPLAIN_TEMPLATE_LOADING.이 답변이 처음 작성된 후에 추가되었습니다.
Martijn Pieters

2
내 로컬 플라스크 (Windows)에서 템플릿을 찾을 수있는 ./Templates/index.html것처럼 보이지만 heroku에 배포 할 때 (동일한 Python, 동일한 Flask 버전을 포함하여 동일한 라이브러리 버전이라고 생각했지만 heroku는 Unix 임); TemplateNotFound오류 가 발생합니다. 내가 폴더 이름을 변경 한 후 git mv Templates/index.html templates/index.html, 로컬 (윈도우)와 Heroku가 (유닉스) 버전 일
레드 완두콩

1
@TheRedPea 예, Windows 파일 시스템이 대소 문자를 접어서 Templates== templates. 그러나 Heroku는 대소 문자를 구분하는 파일 시스템으로 Linux를 실행합니다.
Martijn Pieters

13

Flask는 기본적으로 디렉터리 템플릿을 사용한다고 생각합니다. 따라서 귀하의 코드는 이것이 귀하의 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

(파일 / 프로젝트 구조에 대해 제공된 위의 수락 된 답변은 절대적으로 정확합니다.)

또한..

프로젝트 파일 구조를 적절하게 설정하는 것 외에도 적절한 수준의 디렉토리 계층 구조를 보도록 flask에 알려야합니다.

예를 들어 ..

    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. 템플릿 파일은 다음과 같은 하위 디렉토리에 있습니다. templates
  3. 전달하는 이름 render_template은 템플릿 디렉토리에 상대적입니다 (템플릿 디렉토리에 index.html직접 있고 템플릿 디렉토리 auth/login.html의 auth 디렉토리 아래에 있음).
  4. 앱과 이름이 같은 하위 디렉터리가 없거나 템플릿 디렉터리가 해당 하위 디렉터리 내에 있습니다.

그래도 작동하지 않으면 디버깅 ( app.debug = True)을 켜서 문제를 파악하는 데 도움이 될 수 있습니다.


3

설치된 패키지에서 코드를 실행하는 경우 템플릿 파일이 디렉토리에 있는지 확인하십시오 <python root>/lib/site-packages/your-package/templates.


세부 사항 :

내 경우에는 내가 프로젝트의 예를 실행하려고했다 flask_simple_ui을 하고 jinja항상 말할 것

jinja2.exceptions.TemplateNotFound : form.html

트릭은 샘플 프로그램이 설치된 패키지를 가져 오는 것 flask_simple_ui입니다. 그리고 ninja그 패키지 내부에서 사용되는 것은 내 경우에는 예상대로 ...python/lib/site-packages/flask_simple_ui대신 패키지 경로를 조회하기 위해 루트 디렉토리로 사용하고 os.getcwd()있습니다.

내 불행히도 setup.py버그가 있으며 누락 된 form.html. 수정하면 TemplateNotFoundsetup.py 의 문제가 사라졌습니다.

누군가에게 도움이되기를 바랍니다.


2

나는 동일한 오류가 내가 잘못한 유일한 것은 's'가없는 'template'폴더의 이름을 지정하는 것뿐이었습니다. 그것을 변경 한 후에는 잘 작동했지만 왜 그런지 모르겠습니다.


2

render_template () 함수를 사용하면 templates라는 폴더에서 템플릿 검색을 시도하며 다음과 같은 경우 jinja2.exceptions.TemplateNotFound 오류가 발생합니다.

  1. html 파일이 존재하지 않거나
  2. 템플릿 폴더가없는 경우

문제를 해결하려면 :

python 파일이있는 동일한 디렉토리에 이름 템플릿이있는 폴더를 생성하고 생성 된 html 파일을 templates 폴더에 배치합니다.


1

모든 .html파일을 파이썬 모듈 옆 의 템플릿 폴더 에 넣어야합니다 . html 파일에 사용중인 이미지가있는 경우 모든 파일을 static 폴더에 넣어야합니다.

다음 구조에서

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.