Pregunta

¿Hay alguna solución inteligente para almacenar archivos estáticos en el directorio raíz de la aplicación del frasco. Se espera que robots.txt y sitemap.xml que se encuentran en /, así que mi idea era crear rutas para ellos:

@app.route('/sitemap.xml', methods=['GET'])
def sitemap():
  response = make_response(open('sitemap.xml').read())
  response.headers["Content-type"] = "text/plain"
  return response

Debe haber algo más conveniente:)

¿Fue útil?

Solución

La mejor forma de hacerlo es conjunto static_url_path a raíz de URL

from flask import Flask

app = Flask(__name__, static_folder='static', static_url_path='')

Otros consejos

@vonPetrushev que es correcto, en la producción querrá servir archivos estáticos a través de nginx o Apache, sino para el desarrollo Es agradable tener su entorno de desarrollo sencillo tener su aplicación Python que sirve el contenido estático, así que no lo hace tener que preocuparse de cambiar configuraciones y múltiples proyectos. Para ello, tendrá que utilizar el 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')
    })

En este ejemplo se asume sus archivos estáticos están en la "estática" carpeta, se ajustan a lo que se adecue a su entorno.

La respuesta más limpio a esta pregunta es la respuesta a esta (idéntico) 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:])

Para resumir:

  • como David señaló, con la configuración correcta es de ok para servir a unos archivos estáticos a través de prod
  • buscando /robots.txt no debe dar lugar a una redirección a /static/robots.txt. (En Seans contestar que no está claro de inmediato cómo eso se logra.)
  • que no es limpia para añadir archivos estáticos en la carpeta raíz aplicación
  • Por último, la solución propuesta se ve mucho más limpio que el enfoque de middleware añadiendo:

A pesar de que esta es una vieja pregunta contestada, estoy respondiendo a esto porque este post viene bastante alto en los resultados de Google. A pesar de que no está cubierto en la documentación, si se lee los documentos de la API para la Aplicación Frasco constructor de objetos que está cubierto. Con la aprobación de la static_folder parámetro denominado de esta manera:

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

... puede definir en archivos estáticos se sirven de. Del mismo modo, se puede definir un template_folder, el nombre de ustedes static_url_path.

Sirviendo archivos estáticos no tiene nada que ver con la aplicación que está destinada a entregar el contenido dinámico. La forma correcta de servir archivos estáticos depende de qué servidor está utilizando. Después de todo, cuando llegue a su aplicación en funcionamiento, tendrá que unirse a un servidor web. Sólo puedo hablar de Apache httpd, por lo que la forma de servir archivos estáticos se define en la máquina virtual que va a enlazar a su aplicación a través de mod-WSGI. Aquí está la guía que le mostrará cómo servir mapas de sitio, robots.txt o cualquier contenido estático: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site

Otra manera de enviar archivos estáticos es usar un cajón de sastre regla como la siguiente:

@app.route('/<path:path>')
def catch_all(path):
    if not app.debug:
        flask.abort(404)
    try:
        f = open(path)
    except IOError, e:
        flask.abort(404)
        return
    return f.read()

Lo utilizo para tratar de minimizar la puesta a punto en el desarrollo. Tengo la idea de http://flask.pocoo.org/snippets/57/

Además, estoy desarrollando utilizando frasco en mi máquina autónoma, sino desplegar con Apache en el servidor de producción. Yo uso:

file_suffix_to_mimetype = {
    '.css': 'text/css',
    '.jpg': 'image/jpeg',
    '.html': 'text/html',
    '.ico': 'image/x-icon',
    '.png': 'image/png',
    '.js': 'application/javascript'
}
def static_file(path):
    try:
        f = open(path)
    except IOError, e:
        flask.abort(404)
        return
    root, ext = os.path.splitext(path)
    if ext in file_suffix_to_mimetype:
        return flask.Response(f.read(), mimetype=file_suffix_to_mimetype[ext])
    return f.read()

[...]

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-d', '--debug', dest='debug', default=False,
                      help='turn on Flask debugging', action='store_true')

    options, args = parser.parse_args()

    if options.debug:
        app.debug = True
        # set up flask to serve static content
        app.add_url_rule('/<path:path>', 'static_file', static_file)
    app.run()

Esto podría haber sido añadido desde que se hizo esta pregunta, pero yo estaba mirando a través de "helpers.py" del frasco y me encontré con flask.send_from_directory:

send_from_directory(directory, filename, **options)
'''
  send_from_directory(directory, filename, **options)
  Send a file from a given directory with send_file.  This
  is a secure way to quickly expose static files from an upload folder
  or something similar.
'''

... cuyas referencias flask.send_file:

send_file(filename_or_fp, mimetype=None, as_attachment=False, attachment_filename=None, add_etags=True, cache_timeout=43200, conditional=False)

... que parece mejor para un mayor control, aunque pases send_from_directory ** directamente a través de las opciones de send_file.

A partir de la documentación aquí: http://flask.pocoo.org/docs/ Inicio rápido / # static-archivos

  

aplicaciones web dinámicas necesitan estática   archivos también. Eso es por lo general cuando   los archivos CSS y JavaScript son   procedente de. Lo ideal sería que su servidor web   está configurado para servir a ellos para usted,   pero durante el desarrollo del frasco puede hacer   eso tambien. Basta con crear una carpeta   llamada estática en el paquete o el próximo   a su módulo y será   disponible en / estática en la   aplicación.

     

Para generar URL a esa parte de la   URL, utilice la dirección URL especial 'estático'   Nombre:

     

url_for ( 'estático',   nombre de archivo = 'style.css')

     

El archivo tiene que ser almacenado en el   sistema de archivos como estática / style.css.

Estoy teniendo el mismo dilema que bien. Hizo un poco de búsqueda y encontró mi respuesta (MHO):

La fuerza también citar la documentación

  

aplicaciones web dinámicas necesitan archivos estáticos como así. Eso es por lo general donde los archivos CSS y JavaScript están viniendo. Lo ideal sería que su servidor web está configurado para servir para usted, pero durante el desarrollo del frasco puede hacer eso también . Basta con crear una carpeta llamada estática en su paquete o al lado de su módulo y que estará disponible en / estática de la aplicación.

En mi humilde opinión: Cuando la aplicación está a la producción , que sirve archivo estático debe ser (o es lo ideal) configurado en el servidor web (nginx, Apache); pero durante Desarrollo , Frasco lo puso a disposición para servir archivos estáticos. Esto es para ayudar a desarrollar rápidamente - sin necesidad de servidores web de configuración y tal.

Espero que ayuda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top