2017-10-19 09:52:18

flask模板文件夹和文件都存在,为什么还是 jinja2.exceptions.TemplateNotFound

最近想从零开始用flask写一个小web应用,遇到一个贼郁闷的问题,就是初学者经常会遇到的jinja2.exceptions.TemplateNotFound

问题是我的模板文件夹和模板文件都存在,并且位置正确,为啥还是这样呢?

这里重点提下:templates存在,应用以包的形式存在并且templates文件夹放在和应用包的__init__.py的同级目录

不得已,可耻的去网上搜索了下,说的都是别人说过的templates要放在应用的下面。可是我就是这样做的啊。这里贴下我的目录结构

├── app
│   ├── config.py
│   ├── __init__.py
│   ├── templates
│   │   ├── index.html
│   │   └── signin.html
│   └── views
│       ├── admin.py
│       ├── index.py
│       ├── __init__.py
└── runapp.py

无奈,想着是不是我的位置真的放错了,然后灵光一闪把templates和app放在同级目录下看看?

├── app
│   ├── config.py
│   ├── __init__.py
│   └── views
│       ├── admin.py
│       ├── index.py
│       ├── __init__.py
├── templates
│   ├── index.html
│   └── signin.html
└── runapp.py

居然ok了。

所以问题在哪里呢?看看我的主要代码:

# runapp.py

    from app.config import Config
    from app import create_app_from_object
    app = create_app_from_object(Config, __name__)

# app/__init__.py

    from flask import Flask
    from app import views

    def create_app_from_object(config_obj, app_name):
        app = Flask(app_name)
        app.config.from_object(config_obj)
        return app

当我把代码改成下面这样:

# runapp.py

    from app.config import Config
    from app import create_app_from_object
    app = create_app_from_object(Config)

# app/__init__.py

    from flask import Flask
    from app import views

    def create_app_from_object(config_obj):
        app = Flask(__name__)
        app.config.from_object(config_obj)
        return app

就可以把templates文件夹放到app下面了。

所以问题就是在传递给Flask()的第一个参数,它是应用的名字,在第一种情况中它是__main__,第二种情况中它是app

所以很明显了:

  • 如果应用的名字是__main__,那么应该templates文件夹应该放在执行脚本的目录下
  • 如果应用的名字是其他的,那么templates文件夹应该放在应用文件夹的目录下

当然这只是默认情况,都是可以配置的,上面的说法可能也不准确,这样理解八九不离十了,贴上官方的说明。

Flask will look for templates in the templates folder. So if your application is a module, this folder is next to that module, if it’s a package it’s actually inside your package。

感觉这段话也有点误导的意思,其实还是和Flask()的参数有关~

Permanent link of this article:http://nulls.cc/post/flask_jinja2_exceptionstemplatenotfound

-- EOF --