J'avais une application Flask qui fonctionnait bien jusqu'à ce que, en raison de la croissance, je décide de la modulariser. La nouvelle structure est la suivante :
├── 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
Voici l'application __init__.py
web pour :
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
Voici le code de route de la page de connexion :
@blueprint.route("/login", methods=["GET", "POST"])
def login():
if request.method == 'GET':
return render_template(url_for('static', filename='login.html')
Malheureusement, cette nouvelle structure entraîne cette erreur lorsque j'essaie de servir l'application :
Builtins.FileNotFoundError FileNotFoundError : [Errno 2] Aucun fichier ou répertoire de ce type : '/static/login.html'
Cela fait un moment que je joue avec cela et je ne sais pas comment faire fonctionner l'application et réussir à localiser les fichiers. J'ai essayé de définir la static_url_path
valeur lors de l'instanciation de l'application flask mais, bien que cela réussisse à localiser les fichiers HTML, je ne parviens pas à charger les autres fichiers statiques comme CSS et images car mes chemins sont définis par rapport au dossier statique comme ci-dessous dans le HTML :
<link href="css/bootstrap.min.css?version=24" >
ou alors <link rel="icon" href="/static/images/gear.png">
Aidez-moi, je sens que je vais m'arracher les cheveux car j'ai passé trop de temps sur ce problème. Merci d'avance.
Ce que vous recherchez, c'est le Flask jinja_loader .
Dans votre méthode create_app, vous pouvez écraser le jinja_loader fourni par défaut pour Flask, qui recherche dans le répertoire template_folder pour rechercher un fichier à l'aide de la méthode 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 recherche un modèle dans la liste des chargeurs. Donc d'abord dans app.jinja_loader : le répertoire template_folder. Ensuite, en utilisant le FileSystemLoader dans le répertoire /static. Soyez averti que si vous avez un modèle quelque chose.html à la fois dans le modèle et dans le répertoire statique, le premier sera renvoyé.
Mais Jinja2 a plus de chargeur que le CoiceLoader et vous devriez essayer d'en trouver un qui correspond à vos désirs. Par exemple, le DictLoader avec une clé 'static' pourrait également convenir
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots