我有一个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">
请协助,因为我在这个问题上花了太多时间,所以我觉得我要拔头发了。预先感谢。
答案 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也可以