python - 龙卷风重定向超时
问题描述
我正在尝试向我构建的 Web 应用程序添加一些用户身份验证,所以我在这里使用龙卷风提供的资源(http://www.tornadoweb.org/en/stable/guide/security.html)
除非我故意不匹配我的登录处理程序和重定向(/登录),否则它会超时,在这种情况下我会得到 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()
解决方案
您在 get 请求中使用 @tornado.web.asynchronous 装饰器,删除这将解决问题,或者如果您需要它,您可以在写入命令后调用 self.finish() 。
你可以在这里找到更多关于这个装饰器的信息@tornado.web.asynchronous 装饰器是什么意思?
这是在登录处理程序上使用 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("/")
推荐阅读
- sql - SSAS:如何生成所有有权访问多维数据集的用户的 csv?
- python - 几乎在列表列表中列出 Python
- python - 我如何预测python中的结果?
- laravel - 在 laravel 中显示 Not Acceptable 406 错误
- bash - git cmds 的自动化脚本
- bash - Bash 条件下的误报
- magento2 - Magento 2 - 显示两个路径的类别图像 URL
- javascript - 使用 Angular 9 实现 Facebook Pixel
- google-apps-script - ReferenceError:未定义会议数据服务
- amazon-web-services - 如何删除 AWS Cloud Front 失效?