2017-02-11 24 views
0

Я преподаю себе Tornado, поэтому я купил копию Introduction to Tornado и начал работать с примерами. Я нахожусь на третьем, и это работает, но я не понимаю, как/почему.Понимание информационного потока в приложении Tornado

Ниже приведена модифицированная, но функционально эквивалентная версия кода в книге. У меня есть файл с именем poemaker.py

import os.path 
import tornado.web 
from tornado.options import define, options 


define("port", default=8000, help="run on the given port", type=int) 


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


class PoemPageHandler(tornado.web.RequestHandler): 
    def post(self): 
     name = self.get_argument('name') 
     noun1 = self.get_argument('noun1') 
     noun2 = self.get_argument('noun2') 
     verb = self.get_argument('verb') 
     self.render('poem.html', mary=name, lamb=noun1, snow=noun2, 
        go=verb) 


if __name__ == '__main__': 
    import tornado.httpserver 
    import tornado.ioloop 
    import tornado.options 

    tornado.options.parse_command_line() 
    app = tornado.web.Application(
    handlers=[(r'/', IndexHandler), (r'/poem', PoemPageHandler)], 
    template_path=os.path.join(os.path.dirname(__file__), "templates") 
    ) 

    http_server = tornado.httpserver.HTTPServer(app) 
    http_server.listen(options.port) 
    tornado.ioloop.IOLoop.instance().start() 

Затем в том же каталоге, у меня есть еще один каталог с именем templates, который имеет два HTML файла: index.html и poem.hmtl.

index.html:

<!DOCTYPE html> 
    <html> 
    <head><title>Poem Maker Pro</title></head> 
    <body> 
     <h1>Enter terms below.</h1> 
     <form method="post" action="/poem"> 
      <p>Name<br><input type="text" name="name"></p> 
      <p>Singular noun<br><input type="text" name="noun1"></p> 
      <p>Singualr noun<br><input type="text" name="noun2"></p> 
      <p>Verb w/o object<br><input type="text" name="verb"></p> 
      <input type="submit"> 
    </form> 
    </body> 
</html> 

При запуске сервера, и перейти к http://localhost:8000/, я вижу содержимое index.html оказаны. Это именно то, чего я ожидал бы, потому что это то, что должно делать IndexHandler.

Когда я заполняю форму и нажимаю submit, я попадаю в http://localhost:8000/poem, у которого есть мое стихотворение. Поэтому приложение работает.

То, что я не понимаю, является шагом в середине. Что происходит, когда я попал в submit? Как приложение знает, что отправьте мне форму до http://localhost:8000/poem?

ответ

1

В принципе, на вашем примере у вас установлена ​​служба RESTful с использованием торнадо.

В HTML-форме у вас есть specify, с method="post", что при отправке формы вы будете отправлять данные в полях в виде HTTP-запроса. Кроме того, используя action="/poem", вы указываете, куда отправлять данные формы при отправке формы.

Когда вы нажимаете submit, вы отправляете запрос на отправку HTTP на ваш веб-сервер торнадо. Когда ваш сервер Tornado получает запрос, Tornado выполняет итерацию по списку handlers и создает экземпляр подкласса tornado.web.RequestHandler, PoemPageHandler, который связан с регулярным выражением "/poem", который определен в форме как действие, а затем вызывает метод post().

Последняя команда метода пост() является render: self.render('poem.html', mary=name, lamb=noun1, snow=noun2, go=verb) что делает шаблон poem.html с параметрами, передаваемыми и перенаправить вас на http://localhost:8000/poem.

+0

О, проблема в том, что я идиот! Да, 'action ="/poem "' была той частью, которую я отсутствовал. – Batman