Flacon, reçois 404 de servir les fichiers statiques à l'aide de send_static_file
J'ai suivi les instructions de Comment servir les fichiers statiques dans le Flacon, mais ne pouvait toujours pas de travail.
Voici mon projet structure:
Project_path
|
+--app
| |
| +--main.py
+--static
|
+--js
|
+--jquery-1.11.2.min.js
Voici main.py
:
@app.route('/js/<path:path>')
def serve_static(path):
root_dir = os.path.dirname(os.getcwd())
print(os.path.join(root_dir, 'static', 'js', path))
return app.send_static_file(os.path.join(root_dir, 'static', 'js', path))
Voici index.html
:
...
<script type="text/javascript" src="/js/jquery-1.11.2.min.js"></script>
...
Et lorsque je visite /
, je pouvais voir le chemin d'accès correct du fichier javascript imprimé sur l'écran
qui est Project_path/static/js/jquery-1.11.2.min.js
.
Mais encore, j'ai eu
127.0.0.1 - - [22/Dec/2014 11:26:30] "GET /js/jquery-1.11.2.min.js HTTP/1.1" 404 -
Toute aide est appréciée.
MODIFIER
Après avoir marché à travers le send_static_file
méthode, je trouve ce qu'il se passe. Fondamentalement, je ne devrais pas utiliser abspath comme argument, flacon a un jugement dans send_static_file
:
if os.path.isabs(filename) or \
filename == '..' or \
filename.startswith('../'):
raise NotFound()
Et depuis le filename
j'ai passé en est une abspath, flacon élever NotFound()
.
Il semble que ce qu'elle devait être transmis est un chemin d'accès relatif à self.static_folder
(l'auto est <Flask 'main'>
), qui, dans mon projet, est Project_name/app/static
. Cependant, je n'ai pas static_folder
moi-même ce qui signifie flacon pense que la statique dossier devrait être là.
Je suis encore à essayer de comprendre quoi faire.
- Pourquoi allez-vous à travers tout cela? Flacon sera automatiquement servir des fichiers statiques. Vous n'avez pas besoin d'écrire une vue pour elle.
- Pas tout à fait vrai. flacon sert des fichiers statiques automatiquement si 1. définir src="/static/js/xxx.js"; 2. statique dossier est dans le même directement avec
app.py
. - pour moi, cela m'a travaillé : @app.route('/static/<chemin d'accès:nom de fichier>') def serve_static(nom de fichier): root_dir = os.chemin d'accès.dirname(os.getcwd()) return send_from_directory(os.chemin d'accès.join(root_dir, 'statique', 'js'), nom de fichier)
Vous devez vous connecter pour publier un commentaire.
A finalement obtenu ce travail. utilisation
fiole.send_from_directory
Il est maintenant clair pour moi que le flacon déteste vraiment les gens mettre des
app.py
ou dans mon casmain.py
dans un sous-répertoire. Utilisationsend_static_file
seulement si votre statique dossier est ce flacon pense être, c'est à dire un dossier avec le nomstatic
dans le même répertoire avec app.py.return send_from_directory(os.path.join('.', 'static', 'js'), filename)
Tout ce que vous devez faire est de, passer le
static_url_path
paramètre de l'initiateur:Maintenant, flacon va chercher un répertoire nommé
static
dans/foo/bar/zoo
pour servir les fichiers statiques. Vous utilisez uniquementsend_from_directory
si vous êtes au service des médias fichiers qui ne peuvent pas être dans le même emplacement que les fichiers statiques.static_url_path
pour mon projet? Et ce qui devrait être lesrc
attribut html?static
, et vous n'avez pas besoin de faire des changements dans votre attribut src, il sera exactement comme dans le documentation.static_url_path=Project_path/static/
etsrc="/js/jquery-1.11.2.min.js"
, correct?static
partie, et s'il vous plaît lire la documentation qui l'explique beaucoup mieux que moi dans ces commentaires.static_url_path
etstatic_folder
. À l'aide deurl_for
dans jinja2 pourrait fonctionner, mais c'est une autre histoire.os.path.abspath()
Vous avez oublié d'ajouter
'static'
dans la dernièreos.path.join
dans lereturn
clause.static
, il me donne toujours l'erreur 404.pour moi, cela m'a travaillé :
à côté de l'ajout de ce script init
en
__init__.py
Une cause possible d'erreur 404 pour les pages que vous venez d'ajouter (même si elle a été programmée correctement), c'est que si vous avez les précédentes versions du script (.py fichier) toujours en cours d'exécution: assurez-vous de fermer et arrêter le processus.