2014-12-24 8 views
6

Sto provando a servire una pagina da una directory statica usando l'API Tornado in Python. This answer is similar to what I am trying to do, ma non riesco a farlo funzionare.Python Tornado render static directory

mia struttura di directory si presenta così (tutti i file statici sono all'interno di una cartella chiamata web):

directory file structure

Ho una configurazione server web come questo:

class Application(tornado.web.Application): 
    def __init__(self): 
     handlers = [ 
      (r'/ws', WSHandler), 
      (r'/', IndexHandler), 
     ] 
     settings = { 
      "debug": True, 
      "static_path": os.path.join(os.path.dirname(__file__), "web") 
     } 
     tornado.web.Application.__init__(self, handlers, **settings) 

http_server = tornado.httpserver.HTTPServer(Application()) 
http_server.listen(8888) 
tornado.ioloop.IOLoop.instance().start() 

ho pensato questa riga:

"static_path": os.path.join(os.path.dirname(__file__), "web") 

potrebbe avere risolto il problema, ma quando indico il file index.html:

class IndexHandler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    def get(self): 
     self.render('web/index.html') 

Serve la pagina come previsto, ma le stampe questo messaggio di errore nella console:

WARNING:tornado.access:404 GET /css/reset.css (::1) 3.57ms 
WARNING:tornado.access:404 GET /js/lib/custom-marker.js (::1) 0.96ms 
WARNING:tornado.access:404 GET /js/map.js (::1) 2.08ms 
WARNING:tornado.access:404 GET /js/websocket-client.js (::1) 1.56ms 
WARNING:tornado.access:404 GET /css/index.css (::1) 0.89ms 

In questo esempio minimalista , come posso risolvere il mio problema? Dove sta cercando di indicare e non essere in grado di trovare i file?

Qualsiasi aiuto che potresti offrire sarebbe molto apprezzato!

risposta

4

Secondo la sezione di documentazione su Static files and aggressive file caching, il prefisso degli URL "css" e "js" con "web" dovrebbe risolvere il problema. Per esempio:

/css/reset.css dovrebbe essere /web/css/reset.css

o semplicemente usare la raccomandata static_url nei template (se si sta utilizzando loro):

{{ static_url("css/reset.css") }} 
+0

Wow, ha funzionato! Grazie mille! –

+0

Esattamente. citando: "Questa impostazione renderà automaticamente tutte le richieste che iniziano con/static/serve da quella directory statica, ad esempio http: // localhost: 8888/static/foo.png servirà il file foo.png dalla directory statica specificata. " – Ross

1

In alternativa è possibile specificare jolly alla statica dir di a visualizza tutti i file dalla directory specificata, al momento dell'inizializzazione dell'applicazione

app = web.Application([ 
    (r'/', IndexHandler), 
    (r'/js/(.*)', web.StaticFileHandler, {'path': './static/js'}), 
    (r'/css/(.*)', web.StaticFileHandler, {'path': './static/css'}), 
    (r'/images/(.*)', web.StaticFileHandler, {'path': './static/images'}), 

]) 

a Codice Bove mapperà tutta URL statici di conseguenza,

<script src="js/jquery-1.10.1.min.js"></script> 

verrà mappata /static/js dir,

(r'/js/(.*)', web.StaticFileHandler, {'path': './static/js'}) 

E così, tutto il CSS e immagini per i loro rispettivi mapper,

(r'/css/(.*)', web.StaticFileHandler, {'path': './static/css'}), 
(r'/images/(.*)', web.StaticFileHandler, {'path': './static/images'}), 
+0

Fantastico! quello ha aiutato. –