2014-12-24 4 views
6

Я пытаюсь служить странице из статического каталога, используя Tornado API в Python. This answer is similar to what I am trying to do, но я не могу заставить его работать.Python Tornado render static directory

Моя структура каталогов выглядит следующим образом (все статические файлы находятся в папке под названием web):

directory file structure

У меня есть настройки веб-сервера, как это:

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

я думал эта линия:

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

может быть исправлена ​​проблема, но когда я указываю на index.html файла:

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

Он служит страницу, как ожидалось, но печатает сообщение об ошибке в консоли:

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 

В этом минималистском примере , как я могу исправить свою проблему? Где он пытается указать и не в состоянии найти файлы?

Любая помощь, которую вы могли бы предложить, была бы очень признательна!

ответ

4

В соответствии с разделом документации по Static files and aggressive file caching, префикс ваших URL-адресов «css» и «js» с «web» должен решить вашу проблему. Например:

/css/reset.css должен быть /web/css/reset.css

Или просто использовать в шаблонах рекомендуемую static_url (если вы их используете):

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

Ничего себе! Спасибо огромное! –

+0

Точно. цитируя: «Этот параметр автоматически сделает все запросы, которые начинаются с/static/serve из этого статического каталога, например http: // localhost: 8888/static/foo.png будет служить файлу foo.png из указанного статического каталога. " – Ross

1

В качестве альтернативы вы можете указать, подстановочные статическому реж, чтобы отобразить все файлы из указанного каталога, в то время, когда инициализация приложения

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 Бове код будет отображать все статические URL, соответственно,

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

будет отображаться в /static/js директорию,

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

И так, все CSS и изображения в соответствующих картографов,

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

Удивительный! что помогло. –

Смежные вопросы