阅读背景:

sae中tornado的坑----登录重定向(set_cookie ,set_secure_cookie,get_cookie,get_secure_cookie)

来源:互联网 

简单介绍

再搭建网站时经常会遇到用户认证这种情况,而tornado在用户认证这一块的设计让开发者用起来非常的便捷具体做法需要三步:
1.定义基类,获得current_user的值

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

2.保存内容到cookie

class LoginHandler(BaseHandler):
def get(self):
self.render('login.html')

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

3.在应用的函数中添加@tornado.web.authenticated

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

整个工作的流程如下:
当调用应用WelcomeHandler时, @tornado.web.authenticated会检查current_usr属性的值,如果current_user值为假(None、False、0、”“),任何GET或HEAD请求都将把访客重定向到应用设置中login_url指定的URL。如果current_user的值存在,那么就会进行get请求。

SAE tornado中出现的问题

ps:测试的tornado为sae默认的2.1
<h4>出错了<h4>
1.将如上代码贴到sae,当用户登录后,会重定向到欢迎页面,此时当我们不断的刷新欢迎页面,大概刷新几次后页面就会重定向到登录页面了。而此时浏览器中的cookie也保存了username。

2.好奇怪,为什么刷新了几次后又识别不了呢?然后我们不登录,再去请求欢迎页面。这时候奇怪的事情又出现了。这下子又可以请求了。

3.然后不断的重复刷新欢迎页面,刷新几次后又重定向到登录页面了,再多次请求欢迎页面,终会成功的请求。

分析:

首先我们的代码没问题,放到本地运行好好的放到SAE就有问题了,难道是我用错方式了.因为sae有两种搭建tornado应用的方式,即tornado worke 和WSGI。因为SAE 中有说tornado worket 不稳定,要冒险使用。于是我又换成WSGI试了一遍。
然后我们只能怀疑SAE的问题了。于是乎我把上面例子中的set_secure_cookie ,get_secure_cookie 全部换成了get_cookie,set_cookie。然后再去重复上面的操作,这下就不会重定向了。
然后问了sae PYTHON 的版主,得到了如下答复:


原来是sae的的问题。
好吧,这个我们就没办法了。。。

后记

       cookie是基于session的,即打开浏览器设置cookie后,只要不关闭浏览器cookie会一直保存,关闭浏览器后cookie删除,其实就是保存在浏览器运行进程的那块内存中。secure_cookie是保存在硬盘中的cookie,过期时间为一个月,所以一旦设置secure_cookie后,不论浏览器关闭与否,只要不清空cookie,这个值就一直保存直到cookie过期失效。

如果这样的华用set_cookie 保存cookie 那么用户不是要经常请求登录么?
我在sae上换个tornado3.1试试怎么样?结果还是一样! 希望再sae上用tornado的人们能看到这篇文章,大家少走弯路就好。


分享到: