2012-04-15 6 views
28

Estoy tratando esto:Usando Tornado, ¿cómo sirvo los archivos estáticos y sirvo un favicon.ico desde un directorio diferente al de la ruta estática?

favicon_path = '/path/to/favicon.ico' 

settings = {'debug': True, 
      'static_path': os.path.join(PATH, 'static')} 

handlers = [(r'/', WebHandler), 
      (r'/favicon.ico', tornado.web.StaticFileHandler, {'path': favicon_path})] 

application = tornado.web.Application(handlers, **settings) 
application.listen(port) 
tornado.ioloop.IOLoop.instance().start() 

pero sigue sirviendo a la favicon.ico que tengo en mi static_path (tengo dos de diferentes Favicon.ico en dos caminos separados, como se indica más arriba, pero yo quiero estar capaz de anular el que está en static_path).

Respuesta

46

Borrar static_path desde la configuración de la aplicación.

asentando después de su manejador como:

handlers = [ 
      (r'/(favicon\.ico)', tornado.web.StaticFileHandler, {'path': favicon_path_dir}), 
      (r'/static/(.*)', tornado.web.StaticFileHandler, {'path': static_path_dir}), 
      (r'/', WebHandler) 
] 
+0

Bien, hice que esto funcione al cambiarlo a r '/ (favicon \ .ico)'. ¿Por qué funcionó eso? (Lo copié de un ejemplo similar en los documentos). – shino

+5

parece que establecer static_path en la configuración de la aplicación tiene un caso especial para favicon y robots.txt. from the docs: 'vamos a servir /favicon.ico y /robots.txt desde el mismo directorio [static_path] ' –

+8

@shino Funcionó porque r'/favicon.ico 'es una expresión regular y usted escapó correctamente del'. ' – SK9

4

Es necesario para envolver favicon.ico con paréntesis y escapar del período en la expresión regular. Su código se convertirá en

favicon_path = '/path/to/favicon.ico' # Actually the directory containing the favicon.ico file 

settings = { 
    'debug': True, 
    'static_path': os.path.join(PATH, 'static')} 

handlers = [ 
    (r'/', WebHandler), 
    (r'/(favicon\.ico)', tornado.web.StaticFileHandler, {'path': favicon_path})] 

application = tornado.web.Application(handlers, **settings) 
application.listen(port) 
tornado.ioloop.IOLoop.instance().start() 
Cuestiones relacionadas