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

파일을 렌더링하려고합니다 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



답변

올바른 위치에 템플릿 파일을 만들어야합니다. 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 앱 템플릿 디렉터리가 항상 먼저 검색됩니다.


답변

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 파일을 만들고 해당 파일을 템플릿 폴더에 넣습니다.


답변

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

또한..

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

예를 들어 ..

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

로 시작하면 ../한 디렉토리 뒤로 이동하고 거기서 시작합니다.

로 시작하면 ../../두 개의 디렉토리가 뒤로 이동하고 거기에서 시작됩니다 (등 …).

도움이 되었기를 바랍니다


답변

이유는 모르겠지만 대신 다음 폴더 구조를 사용해야했습니다. 나는 “템플릿”을 한 단계 위로 올렸다.

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

이것은 아마도 다른 곳에서 구성이 잘못되었음을 나타낼 수 있지만 그것이 무엇인지 알 수 없었고 이것이 작동했습니다.


답변

다음 사항을 확인하십시오.

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

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


답변

설치된 패키지에서 코드를 실행하는 경우 템플릿 파일이 디렉토리에 있는지 확인하십시오 <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 의 문제가 사라졌습니다.

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


답변

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