2014-12-24 15 views
6

Ich versuche, eine Seite aus einem statischen Verzeichnis mithilfe der Tornado-API in Python bereitzustellen. This answer is similar to what I am trying to do, aber ich kann es nicht funktionieren.Python Tornado rendern statisches Verzeichnis

Meine Verzeichnisstruktur sieht wie folgt aus (alle statischen Dateien in einem Ordner sind web genannt):

directory file structure

Ich habe einen Web-Server-Setup wie folgt aus:

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

Ich dachte, Diese Zeile:

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

könnte das Problem behoben haben, aber wenn ich auf die index.html Datei zeigen:

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

Es dient die Seite als erwartet, aber druckt diese Fehlermeldung an die Konsole:

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 diesem minimalistischen Beispiel Wie behebe ich mein Problem? Wo versucht er zu zeigen und kann die Dateien nicht finden?

Jede Hilfe, die Sie anbieten könnten, würde sehr geschätzt werden!

Antwort

4

Gemäß dem Dokumentationsabschnitt Static files and aggressive file caching sollte das Voranstellen der URLs "css" und "js" mit "web" Ihr Problem lösen. Zum Beispiel:

/css/reset.css sollte /web/css/reset.css

oder einfach nur die empfohlene static_url in Ihren Vorlagen verwenden (wenn Sie sie verwenden):

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

Wow, das hat funktioniert! Ich danke dir sehr! –

+0

Genau. Zitat: "Diese Einstellung wird automatisch alle Anfragen machen, die mit/static/serve von diesem statischen Verzeichnis starten, zB http: // localhost: 8888/static/foo.png wird die Datei foo.png aus dem angegebenen statischen Verzeichnis bedienen. " – Ross

1

Alternativ Sie Wildcard zum statischen dir die angeben können rendert alle Dateien aus dem angegebenen Verzeichnis zu dem Zeitpunkt, an dem die Anwendung initialisiert wurde

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 bove Code werden alle statischen URLs entsprechend abzubilden,

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

wird /static/js dir abgebildet werden,

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

Und so, alle CSS und Bilder, die auf ihren jeweiligen Mapper,

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

Super! das hat geholfen. –