如何使用蓝图在Flask中提供静态文件

时间:2018-08-19 04:41:00

标签: python flask jinja2

我有一个Flask应用程序运行良好,直到由于增长而决定模块化。新的结构如下:

├── Dockerfile
├── README.md
├── app
│   ├── __init__.py
│   ├── config.py
│   ├── cron.py
│   ├── database.ini
│   ├── db.py
│   ├── db.sqlite3
│   └── webapp
│       ├── __init__.py
│       └── routes.py
├── db.sqlite3
├── docker-compose.yml
├── error.log
├── gunicorn_config.py
├── rd.py
├── requirements.txt
├── static
│   ├── css
│   │   └── bootstrap.min.css
│   ├── data.html
│   ├── fonts
│   │   ├── glyphicons-halflings-regular.eot
│   │   ├── glyphicons-halflings-regular.svg
│   │   ├── glyphicons-halflings-regular.ttf
│   │   ├── glyphicons-halflings-regular.woff
│   │   └── glyphicons-halflings-regular.woff2
│   ├── images
│   │   ├── ajax-loader.gif
│   │   ├── gear.png
│   │   ├── gear_small.png
│   │   └── logo.png
│   ├── index.html
│   ├── js
│   │   ├── app.js
│   │   ├── bootbox.min.js
│   │   ├── bootstrap.js
│   │   ├── bootstrap.min.js
│   │   └── npm.js
│   ├── login.html
│   ├── manage_users.html
│   ├── register.html
│   ├── reset_password.html
│   ├── settings.html
│   └── upload.html
└── templates
    └── base.html

以下是网络应用的__init__.py

from flask import Flask
from app.config import DebugConfig
from flask_sqlalchemy import SQLAlchemy
from importlib import import_module
from logging import basicConfig, DEBUG, getLogger, StreamHandler
import os

import uuid

def register_blueprints(app):
    for module_name in (app.config['MODULES']):
        module = import_module('app.{}.routes'.format(module_name))
        app.register_blueprint(module.blueprint)

def configure_logs(app):
    basicConfig(filename='error.log', level=DEBUG)
    logger = getLogger()
    logger.addHandler(StreamHandler())

def create_app():
    file = (__file__)
    app = Flask(__name__)
    app.secret_key = str(uuid.uuid4())
    app.config.from_object(DebugConfig)
    register_blueprints(app)
    configure_logs(app)

    return app

这是登录页面的路由代码:

@blueprint.route("/login", methods=["GET", "POST"])
def login():

    if request.method == 'GET':
        return render_template(url_for('static', filename='login.html')

不幸的是,当我尝试为应用提供服务时,这种新结构会导致此错误:

  

builtins.FileNotFoundError FileNotFoundError:[错误2]没有此类文件   或目录:“ / static / login.html”

我已经搞混了一段时间了,只是想不通如何使应用程序正常工作并设法找到文件。我在实例化flask应用程序时尝试设置static_url_path值,但是,尽管可以设法找到HTML文件,但是我无法加载其他静态文件(如CSS和图像),因为我已定义了相对于静态文件的路径HTML中的以下文件夹:

<link href="css/bootstrap.min.css?version=24" ><link rel="icon" href="/static/images/gear.png">

请协助,因为我在这个问题上花了太多时间,所以我觉得我要拔头发了。预先感谢。

1 个答案:

答案 0 :(得分:0)

您正在寻找的是Flask jinja_loader

在您的create_app方法中,您可以覆盖Flask默认提供的jinja_loader,后者会查看 template_folder 目录,以使用render_template方法搜索文件。

def create_app():
    file = (__file__)
    app = Flask(__name__)
    app.secret_key = str(uuid.uuid4())
    app.config.from_object(DebugConfig)
    register_blueprints(app)
    configure_logs(app)

    # Overwrite Flask jinja_loader, using ChoiceLoader
    template_loader = jinja2.ChoiceLoader([
        app.jinja_loader,
        jinja2.FileSystemLoader('/path/to/static'),
    ])
    app.jinja_loader = template_loader

    return app

Jinja2 ChoiceLoader在加载程序列表中查找模板。 因此,首先在app.jinja_loader中:template_folder目录。 然后使用/ static目录中的FileSystemLoader。 请注意,如果模板和静态目录中都有模板something.html,则将返回第一个。

但是Jinja2的加载器不仅仅是CoiceLoader,您应该尝试找到适合您需求的加载器。例如,带有键“静态”的DictLoader也可以