在教程之后,我编写了一个管理命令来启动龙卷风,它看起来像:
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()
上有一些错误,但我不知道它是什么。
有谁能指导我这里出了什么问题?
答案 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中访问它的东西。 老实说,没有调试器和相同的环境,我无法弄清楚问题。