2015-08-07 3 views
1

Я новичок в Tornado и пишу основное приложение, но также хочу добавить обработку ошибок. Ниже приведен код.Обработка ошибок в Tornado

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

from tornado import gen 
from tornado.web import asynchronous 
from tornado.options import define, options 

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

class Application(tornado.web.Application): 
    def __init__(self): 
     handlers = [ 
      (r"/", HomeHandler), 
      (r"/mycompany", myCustomHandler), 
      (r"/mycompany/", myCustomHandler), 
     ] 
     super(Application, self).__init__(handlers) 

class HomeHandler(tornado.web.RequestHandler): 
     def get(self): 
       self.render("home.html") 

class myCustom(tornado.web.RequestHandler): 
     def get(self): 
       self.write("Processing....") 
       self.clear() 
       self.finish() 

def main(): 
    tornado.options.parse_command_line() 
    http_server = tornado.httpserver.HTTPServer(Application()) 
    http_server.listen(options.port) 
    tornado.ioloop.IOLoop.current().start() 

if __name__ == "__main__": 
    main() 

Дом.html отлично работает.

Далее, я хотел бы, чтобы пользователи передавали параметры с использованием формата примерно http://host:port/mycompany/?id=9999.

Но хотите отобразить страницу 404, когда кто-то входит * host: port/blahblah или * host: port/mycompany /? Something = 9999. Как мне это сделать? Спасибо.

+0

возможно дубликат [Изящно обработки исключений приложения в приложении Tornado] (http://stackoverflow.com/questions/11392952/gracefully-handling-application-exceptions-in-a-tornado -заявление) – satoru

ответ

1

Чтобы использовать страницу пользовательских ошибок для неизвестных URL-адресов, используйте аргумент default_handler_class для Application(). Ошибки, вызванные в пределах, обработчик использует метод write_error для создания страниц с ошибками. Использование одной и той же обработки ошибок для обоих задач немного сложно; вот основные строительные леса:

class BaseHandler(tornado.web.RequestHandler): 
    def write_error(self, status_code, **kwargs): 
     if status_code == 404: 
      self.render("404.html") 
     else: 
      self.render("error.html") 

class My404Handler(BaseHandler): 
    def prepare(self): 
     raise tornado.web.HTTPError(404) 

class MyCustomHandler(BaseHandler): 
    def get(self): 
     if not self.valid_arguments(): 
      raise tornado.web.HTTPError(400) 

app = Application([...], default_handler_class=My404Handler)