2012-04-15 10 views
28

Sto provando questo:Usando Tornado, come posso servire file statici e servire un favicon.ico da una directory diversa da quella statica?

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() 

ma mantiene servire il favicon.ico che ho nel mio static_path (ho due Favicon.ico differenti di in due percorsi separati, come sopra indicato, ma voglio essere in grado di sovrascrivere quello nel percorso statico).

risposta

46

Elimina static_path dalle impostazioni dell'applicazione.

quindi impostare il gestore come:

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

Va bene, ho ottenuto questo al lavoro cambiando a r '/ (favicon \ .ico)'. Perché ha funzionato? (L'ho copiato da un esempio simile nella documentazione.) – shino

+5

sembra che l'impostazione di static_path nelle impostazioni dell'app abbia un caso speciale per favicon e robots.txt. dai docs: 'serviremo /favicon.ico e /robots.txt dalla stessa directory [static_path]' –

+8

@shino Ha funzionato perché r '/ favicon.ico' è un'espressione regolare e hai eseguito correttamente l'escape di '.' – SK9

4

È necessario avvolgere favicon.ico con parentesi e sfuggire il periodo nell'espressione regolare. Il tuo codice diventerà

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()