django tornado开始时获得403错误

时间:2015-10-02 09:56:12

标签: django tornado

在教程之后,我编写了一个管理命令来启动龙卷风,它看起来像:

import signal
import time

import tornado.httpserver
import tornado.ioloop

from django.core.management.base import BaseCommand, CommandError

from privatemessages.tornadoapp import application

class Command(BaseCommand):
    args = '[port_number]'
    help = 'Starts the Tornado application for message handling.'

    def sig_handler(self, sig, frame):
        """Catch signal and init callback"""
        tornado.ioloop.IOLoop.instance().add_callback(self.shutdown)

    def shutdown(self):
        """Stop server and add callback to stop i/o loop"""
        self.http_server.stop()

        io_loop = tornado.ioloop.IOLoop.instance()
        io_loop.add_timeout(time.time() + 2, io_loop.stop)

    def handle(self, *args, **options):
        if len(args) == 1:
            try:
                port = int(args[0])
            except ValueError:
                raise CommandError('Invalid port number specified')
        else:
            port = 8888


        self.http_server = tornado.httpserver.HTTPServer(application)
        self.http_server.listen(port, address="127.0.0.1")


        # Init signals handler
        signal.signal(signal.SIGTERM, self.sig_handler)

        # This will also catch KeyboardInterrupt exception
        signal.signal(signal.SIGINT, self.sig_handler)
        print "start"

        tornado.ioloop.IOLoop.instance().start()
        print "end"

在这里,当我运行此管理命令时,我得到龙卷风tornado.access:403 GET /2/ (127.0.0.1) 1.92ms错误

出于测试目的,我打印了“开始”和“结束”。我想当这个命令成功执行时,应该打印“结束”。

这里只打印“start”而不是“end”。我想tornado.ioloop.IOLoop.instance().start()上有一些错误,但我不知道它是什么。

有谁能指导我这里出了什么问题?

1 个答案:

答案 0 :(得分:0)

在启动ioloop之前忘了放self.http_server.start()

...
self.http_server = tornado.httpserver.HTTPServer(application)
self.http_server.listen(port, address="127.0.0.1")
self.http_server.start()
...

更新

随着httpserver开始缺失,您使用的是this library吗?

您的管理命令正好是this one

他们的教程是俄语,老实说,我不读俄语。

UPDATE2:

在他们的代码中看到的是url /(?P<thread_id>\d+)/是一个websocket处理程序:

application = tornado.web.Application([
    (r"/", MainHandler),
    (r'/(?P<thread_id>\d+)/', MessagesHandler),
])

...

class MessagesHandler(tornado.websocket.WebSocketHandler):
...

但是你发布的错误似乎是试图通过GET在http中访问它的东西。 老实说,没有调试器和相同的环境,我无法弄清楚问题。