Tornado 下一个查询字符串 URL 参数

Posted

技术标签:

【中文标题】Tornado 下一个查询字符串 URL 参数【英文标题】:Tornado next query string URL parameter 【发布时间】:2013-11-29 16:30:34 【问题描述】:

问题

由于 Tornado 附加了一个下一个查询字符串参数,其中包含构建重定向 URL 的资源的 URL,有时我们可以在登录或注销应用行 @987654321 后将用户重定向回引用页面@

但是当我在下面的代码中使用它时,它不起作用。 不登录,访问Page /test时,会重定向到/login?next=%2Ftest,但参数next总是为空,它将被重定向到 根页面 而不是 /test

我该如何解决这个问题?

代码

import os
import tornado.wsgi
import tornado.web
import tornado.options
import tornado.ioloop

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

class MainHandler(BaseHandler):
    @tornado.web.authenticated
    def get(self):
        self.render('index.html', user = self.current_user)

class LoginHandler(BaseHandler):
    def get(self):
        if self.get_current_user():
            self.redirect('/')
            return
        self.render('login.html')

    def post(self):
        self.set_secure_cookie("user", self.get_argument("username"))
        self.redirect(self.get_argument('next', '/'))

class LogoutHandler(BaseHandler):
    def get(self):
        if not self.get_current_user():
            self.redirect('/')
            return
        self.clear_cookie("user")
        self.redirect(self.get_argument("next", "/"))

class TestHandler(BaseHandler):
    @tornado.web.authenticated
    def get(self):
        self.write("Testing!)

settings =  
    "static_path" : os.path.join(os.path.dirname(__file__), "static"),
    "template_path" : os.path.join(os.path.dirname(__file__), "templates"),
    "login_url" : "/login",
    "cookie_secret" : "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
    "gzip" : True,
    "debug" : True,


application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/login", LoginHandler),
    (r"/logout", LogoutHandler),
    (r"/test", TestHandler),
], **settings)

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

【问题讨论】:

【参考方案1】:

LoginHandlerget 方法中,使用next 参数进行重定向

...

class LoginHandler(BaseHandler):
    def get(self):
        if self.get_current_user():
            self.redirect(self.get_argument('next', '/')) # Change this line
            return
        self.render('login.html')

...

【讨论】:

我不明白为什么get 方法需要这个。用户输入凭据,post 方法处理它并进行重定向。但是为什么get 方法需要它呢? @avi 当用户导航到您的登录表单页面(例如从您的公共主页上的“登录”链接)并且您希望自动重定向登录用户时,这很有用 我还是不明白。用户访问需要登录的受保护页面。他将被重定向到登录表单,下一个参数包括受保护的页面。他输入登录名,它将由登录处理程序方法的 POST 处理并进行重定向。登录的 GET 在这里出现在哪里? @avi 假设用户已经登录,但不知何故他再次导航到登录页面。应该发生什么?您不应该为他呈现登录表单,因为他是经过身份验证的用户!这就是为什么。

以上是关于Tornado 下一个查询字符串 URL 参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新加载的情况下修改 URL 查询字符串

从 url 查询字符串参数中提取单独的值

js获取url查询字符串参数

逐个访问URL的每个查询字符串参数

如何将带有查询字符串的 url 作为 api 参数传递?

与号 url 编码和查询字符串参数问题