99 votes

Les fichiers statiques dans ballon - robot.txt, sitemap.xml (mod_wsgi)

Est-il une solution astucieuse pour stocker des fichiers statiques dans le répertoire racine de l’application de la fiole. robots.txt et sitemap.xml sont censés se trouve dans /, donc mon idée était de créer des itinéraires pour eux :

Il doit y avoir quelque chose de plus pratique  :)

81voto

dns Points 643

Le meilleur moyen consiste à static_url_path la valeur url racine

71voto

bebbi Points 440

Le plus propre réponse à cette question est la réponse à cette (identiques) question:

from flask import Flask, request, send_from_directory
app = Flask(__name__, static_folder='static')    

@app.route('/robots.txt')
@app.route('/sitemap.xml')
def static_from_root():
    return send_from_directory(app.static_folder, request.path[1:])

Pour résumer:

  • comme David l'a souligné, avec la bonne config c'est ok pour servir quelques fichiers statiques à travers prod
  • la recherche d' /robots.txt ne devrait pas entraîner une redirection vers /static/robots.txt. (En Seans réponse il n'est pas immédiatement clair comment c'est réalisé).
  • ce n'est pas propre à la statique ajouter des fichiers dans le dossier racine de l'application
  • enfin, la solution proposée est beaucoup plus propre que l'ajout de middleware approche:

67voto

Philip Southam Points 4807

@vonPetrushev est à droite, dans la production, vous aurez envie de servir les fichiers statiques via nginx ou apache, mais pour le développement, il est agréable d'avoir votre environnement de dev simple d'avoir votre python application desservant le contenu statique en tant que bien de sorte que vous n'avez pas à vous soucier de changer les configurations et de multiples projets. Pour ce faire, vous aurez envie d'utiliser le SharedDataMiddleware.

from flask import Flask
app = Flask(__name__)
'''
Your app setup and code
'''
if app.config['DEBUG']:
    from werkzeug import SharedDataMiddleware
    import os
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
      '/': os.path.join(os.path.dirname(__file__), 'static')
    })

Cet exemple suppose que vos fichiers statiques sont dans le dossier "statique", ajuster à ce qui convient à votre environnement.

23voto

Sean McSomething Points 4383

Même si c'est un vieux répondu à la question, je vais répondre à cela parce que ce post vient assez haut dans les résultats de Google. Alors il n'est pas dans la documentation, si vous lisez les docs de l'API pour le ballon d'Application du constructeur d'objet, il est couvert. En passant le paramètre nommé static_folder comme:

from flask import Flask
app = Flask(__name__,
            static_folder="/path/to/static",
            template_folder="/path/to/templates")

...vous pouvez définir l'endroit où les fichiers statiques sont servis à partir de. De même, vous pouvez définir un template_folder, le nom de vous - static_url_path.

16voto

vonPetrushev Points 2149

Servir les fichiers statiques n'a rien à voir avec l'application qui est destiné à fournir du contenu dynamique. La bonne manière de servir les fichiers statiques est dépendante de ce serveur que vous utilisez. Après tout, quand vous obtenez de votre application et d'exécution, vous devez le lier à un serveur web. Je ne peux parler que pour apache httpd, afin de la manière de servir les fichiers statiques est défini dans le serveur virtuel que vous liez à votre demande par le biais de mod_wsgi. Voici le guide qui va vous montrer comment servir les sitemaps, robots.txt ou tout contenu statique: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X