论坛首页 编程语言技术论坛

python学习笔记 - secure cookie@tornado 学习记录一

浏览 6218 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-03-06   最后修改:2011-03-06
Tornado使用Cookie-based seesion来管理user auth,参考文档需要注意以下事项:

1. RequestHandler self.current_user 默认情况是None。
2. 实现用户权限管理,我们需要在你的request handler重写get_current_user()来判断(获得)当前合法用户。


由于Cookie是浏览器选项,用户可以选择禁用Cookie,那该如何判断用户浏览器是否禁用Cookie?

我的思路是在用户第一次request GET的时候,在对应的response中设置一个任意的Cookie值,“checkflag”,这样在接下来的第二次request GET/POST的HTTP Header将包含“Cookie”的信息,禁用Cookied的浏览器在HTTP Headers是不会有“Cookie”信息

我这里根据tornado user authentication 示例代码稍作修改,当用户浏览器禁用Cookie的时候给予一定的提示信息:

import tornado.httpserver
import tornado.ioloop
import tornado.web

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


class MainHandler(BaseHandler):
    def get(self):

        if not self.current_user:
            self.redirect("/login")
            return
        name = tornado.escape.xhtml_escape(self.current_user)
        self.write("Hello, " +  name)

class LoginHandler(BaseHandler):

    def get(self):
        self.set_cookie("checkflag", "true")
        self.render("templates/logintest/login.html")

    def post(self):
        if not self.request.headers.get("Cookie"):
            self.render("templates/logintest/require_enable_cookie.html")
            return
        self.set_secure_cookie("user", self.get_argument("name"))
        self.redirect("/")


application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/login", LoginHandler),
], cookie_secret="hello")

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8081)
    tornado.ioloop.IOLoop.instance().start()


<html>
<body>
<form action="/login" method="post">
	name: <input type="text" name="name"/>
	<input type="submit" value="Sign in"/>
</form>
</body>
</html>



Please enable your Cookie option of your browser.


说明:
当首次访问"/"的时候,要求进行用户登录,这里用一个输入框来模拟用户登录,在重定向的"/login" GET对应的response中,提供一个任意“checkflag”cookie值,这样如果用户enable cookie,在下次的http GET/POST请求headers中将会带有“Cookie”信息,否则提供相关的页面信息。

一些Cookie-based session知识:
Cookie-based session 数据是存储在客户端,集群和故障转移是不需要的,在需要的情况下你可以重启servers而不必担心session数据的丢失

Cookie-based session 用户可以访问不同的servers,而不需要被绑定在某一个数据环境(每次的http请求都要求constant querying)

Cookie-based session 只会消耗少量的CPU周期用于校验,任何集中session存储势必会带来一定的瓶颈,即使你保持session data在内存中,这样只会将这些数据绑定在单一的机器上。

Cookie-based session 适用保存一些少量、关键数据,同时需要考虑cookie的一些限制,例如浏览器禁用cookie。

我有试过Gmail,126.com (一些SSL站点)都是需要enable cookie


如果有理解不正确的地方,请大家帮忙予以指正,

   发表时间:2011-03-11  
谢谢,跟着你一起学
0 请登录后投票
   发表时间:2011-03-12  
ryebread 写道
谢谢,跟着你一起学


呵呵,一起学习、分享
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics