Python 龙卷风重定向超时

Python 龙卷风重定向超时,python,webserver,tornado,Python,Webserver,Tornado,我正在尝试向我构建的web应用程序添加一些用户身份验证,以便使用tornado提供的资源() 除非我故意不匹配我的loginhandler和重定向(/login),否则它会超时,在这种情况下,我会得到404 我已经提供了我的代码,我已经剥离了一些基本的东西,因为问题就在这里。但我不知道在哪里。任何帮助都是巨大的 import os import tornado.httpserver import tornado.ioloop import tornado.web import torna

我正在尝试向我构建的web应用程序添加一些用户身份验证,以便使用tornado提供的资源()

除非我故意不匹配我的loginhandler和重定向(/login),否则它会超时,在这种情况下,我会得到404

我已经提供了我的代码,我已经剥离了一些基本的东西,因为问题就在这里。但我不知道在哪里。任何帮助都是巨大的

import os    
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.websocket
from tornado.options import options, define


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

PORT = 8888

class BaseHandler(tornado.web.RequestHandler):
    def get_current_user(self):
        return self.get_secure_cookie("user")

class MainHandler(BaseHandler): 

    @tornado.web.asynchronous
    def get(self):

        # Send our main document
        if not self.current_user:
            self.redirect("/login")
            return

        self.render("index.html")

class LoginHandler(BaseHandler):

    @tornado.web.asynchronous
    def get(self):
        self.write('<html><body><form action="/login" method="post">'
                   'Name: <input type="text" name="name">'
                   '<input type="submit" value="Sign in">'
                   '</form></body></html>')

    def post(self):
        self.set_secure_cookie("user", self.get_argument("name"))
        self.redirect("/")        

class TornadoWebServer(tornado.web.Application):
    ' Tornado Webserver Application...'
    def __init__(self):

        #Url to its handler mapping.
        handlers = [(r"/", MainHandler),
                    (r"/login", LoginHandler),
                    (r"/images/(.*)", tornado.web.StaticFileHandler, {"path": "web/images"}),
                    (r"/js/(.*)", tornado.web.StaticFileHandler, {"path": "web/js"}),
                    (r"/style/(.*)", tornado.web.StaticFileHandler, {"path": "web/style"})]

        #Other Basic Settings..
        settings = dict(
            cookie_secret="set_this_later",
            login_url="/login",
            template_path=os.path.join(os.path.dirname(__file__), "web"),
            static_path=os.path.join(os.path.dirname(__file__), "static"),
            xsrf_cookies=True,
            debug=True)

        #Initialize Base class also.
        tornado.web.Application.__init__(self, handlers, **settings)


if __name__ == '__main__':

    #Tornado Application
    print("Initializing Tornado Webapplications settings...")
    application = TornadoWebServer()

    # Start the HTTP Server
    print("Starting Tornado HTTPServer on port %i" % PORT)
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(PORT)

    # Get a handle to the instance of IOLoop
    ioloop = tornado.ioloop.IOLoop.instance()

    # Start the IOLoop
    ioloop.start()
导入操作系统
导入tornado.httpserver
导入tornado.ioloop
导入tornado.web
导入tornado.websocket
从tornado.options导入选项中,定义
#定义可用选项
定义(“端口”,默认值=8888,type=int,help=“在给定端口上运行”)
端口=8888
类BaseHandler(tornado.web.RequestHandler):
def get_当前_用户(自身):
返回self.get\u secure\u cookie(“用户”)
类MainHandler(BaseHandler):
@tornado.web.asynchronous
def get(自我):
#发送我们的主要文件
如果不是self.current\u用户:
self.redirect(“/login”)
返回
self.render(“index.html”)
类LoginHandler(BaseHandler):
@tornado.web.asynchronous
def get(自我):
自我书写(“”)
'姓名:'
''
'')
def post(自我):
self.set\u secure\u cookie(“用户”,self.get\u参数(“名称”))
self.redirect(“/”)
类tornado web服务器(tornado.web.Application):
“Tornado Web服务器应用程序…”
定义初始化(自):
#指向其处理程序映射的Url。
处理程序=[(r/),MainHandler),
(r“/登录”,LoginHandler),
(r“/images/(.*)”,tornado.web.StaticFileHandler,{“路径”:“web/images”}),
(r“/js/(*)”,tornado.web.StaticFileHandler,{“path”:“web/js”}),
(r“/style/(.*)”,tornado.web.StaticFileHandler,{“path”:“web/style”})]
#其他基本设置。。
设置=听写(
cookie\u secret=“稍后再设置”,
login\u url=“/login”,
template_path=os.path.join(os.path.dirname(_文件,,“web”),
static\u path=os.path.join(os.path.dirname(\uuu file\uuuu),“static”),
xsrf_=真,
debug=True)
#同时初始化基类。
tornado.web.Application.\uuuuu init\uuuuuuu(self,handlers,**设置)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
#龙卷风应用
打印(“初始化Tornado Web应用程序设置…”)
application=webserver()
#启动HTTP服务器
打印(“在端口%i“%port”上启动Tornado HTTPServer)
http_server=tornado.httpserver.httpserver(应用程序)
http_服务器。侦听(端口)
#获取IOLoop实例的句柄
ioloop=tornado.ioloop.ioloop.instance()
#启动IOLoop
ioloop.start()

您正在get请求中使用@tornado.web.asynchronous decorator删除此选项将解决问题,或者如果需要,您可以在执行write命令后调用self.finish()

你可以在这里找到更多关于这位装饰师的信息

下面是一个在登录句柄上使用self.finish的示例

class LoginHandler(BaseHandler):

@tornado.web.asynchronous
def get(self):
    self.write('<html><body><form action="/login" method="post">'
               'Name: <input type="text" name="name">'
               '<input type="submit" value="Sign in">'
               '</form></body></html>')
    self.finish()

def post(self):
    self.set_secure_cookie("user", self.get_argument("name"))
    self.redirect("/")
类LoginHandler(BaseHandler):
@tornado.web.asynchronous
def get(自我):
自我书写(“”)
'姓名:'
''
'')
self.finish()
def post(自我):
self.set\u secure\u cookie(“用户”,self.get\u参数(“名称”))
self.redirect(“/”)

您正在get请求中使用@tornado.web.asynchronous decorator删除此选项将解决问题,或者如果需要,您可以在执行write命令后调用self.finish()

你可以在这里找到更多关于这位装饰师的信息

下面是一个在登录句柄上使用self.finish的示例

class LoginHandler(BaseHandler):

@tornado.web.asynchronous
def get(self):
    self.write('<html><body><form action="/login" method="post">'
               'Name: <input type="text" name="name">'
               '<input type="submit" value="Sign in">'
               '</form></body></html>')
    self.finish()

def post(self):
    self.set_secure_cookie("user", self.get_argument("name"))
    self.redirect("/")
类LoginHandler(BaseHandler):
@tornado.web.asynchronous
def get(自我):
自我书写(“”)
'姓名:'
''
'')
self.finish()
def post(自我):
self.set\u secure\u cookie(“用户”,self.get\u参数(“名称”))
self.redirect(“/”)