Получение 404 на отображаемой странице - PullRequest
0 голосов
/ 04 ноября 2019

Я изучаю, как работают модули и шаблоны Tornado. В этом конкретном примере http://localhost:8000/ возвращает правильную страницу, но http://localhost:8000/recommended возвращает 404 и следующее описание:

Traceback (most recent call last):
  File "/home/stefan/.local/lib/python3.6/site-packages/tornado/web.py", line 1676, in _execute
    result = self.prepare()
  File "/home/stefan/.local/lib/python3.6/site-packages/tornado/web.py", line 2431, in prepare
    raise HTTPError(self._status_code)
tornado.web.HTTPError: HTTP 404: Not Found

Это мой main.py

import os.path

import tornado.web
import tornado.httpserver
import tornado.ioloop
import tornado.options

from tornado.options import define, options
define("port", default=8000, help="run on given port", type=int)

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r"/", MainHandler),
            (r"/recommended/", RecommendedHandler),
        ]

        settings = dict(
            template_path = os.path.join(os.path.dirname(__file__),"templates"),
            static_path =  os.path.join(os.path.dirname(__file__),"static"),
            ui_modules = {"Book" : BookModule },
            debug=True,
        )
        tornado.web.Application.__init__(self,handlers,**settings)

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html", page_title="Burt's Books | Home ", header_text = "Welcome to Burt's Books!",)



class RecommendedHandler(tornado.web.RequestHandler):
    def get(self):
        self.render(
            "recommended.html",
            page_title = "Burt's Books | recommended Reading",
            header_text = "Recommended Reading",
            books = [
                {
                    "title" : "Programming Collective Intelligence",
                },
                ...
            ]
        )


class BookModule(tornado.web.UIModule):
    def render(self,book):
        return self.render_string("modules/book.html", book=book)

if __name__ == "__main__":
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

Структура моей работыкаталог:

Burt's Books /

 /static
 /templates
      /modules
          book.html
      index.html
      main.html
      recommeneded.html
 main.py

Я могу публиковать содержимое других файлов в комментариях, если это необходимо.

1 Ответ

1 голос
/ 04 ноября 2019

Похоже, что вы запрашиваете /recommended, но ваше отображение /recommended/. Я всегда добавляю знак вопроса в конце структуры моего пути, чтобы регулярное выражение охватывало оба. Попробуйте изменить код на следующее:

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r"/", MainHandler),
            (r"/recommended/?", RecommendedHandler),
        ]
...
...