玩蛇记-给tornado加上session支持 - 亚历山大同志 - 博客园
Requirement
- Tornado 2.0
- python-libmemcached 0.4
- Pyrex 0.9.4+
- libmemcached 0.52
邏輯
流程
直接來看code
這是一個可以用在user登入的sample
import tornado.ioloop
import tornado.web
import tornado.options
import cmemcached
import ast
import datetime
from tornado.options import define, options
define("expiration", default = (60 * 60 * 24), help = "session expiration time")
class session_imple():
def __init__(self, key = None):
global mmc
self.key = key
pack = mmc.get(self.key)
if pack:
self.status = True
print pack
self.dict = ast.literal_eval(pack)
return
# session not exist or expire
self.status = False
def __getitem__(self, tag):
return self.dict[tag]
def __setitem__(self, tag, value):
self.dict[tag] = value
def writeback(self):
global mmc
pack = str(self.dict)
mmc.set(self.key, pack, options.expiration)
def session(method):
def wrapper(self, *args, **kwargs):
if not self.current_user:
self.redirect(self.get_login_url())
return
self.session = session_imple(self.current_user)
# check session status
if not self.session.status:
self.clear_cookie("session_key")
self.redirect(self.get_login_url())
return
method(self, *args, **kwargs)
self.session.writeback()
return wrapper
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
return self.get_secure_cookie("session_key")
class MainHandler(BaseHandler):
@session
def get(self):
# Access the session
name = self.session["name"]
self.session["last_access"] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.write("Hello, " + name + ". " +
"logout")
class LoginHandler(BaseHandler):
def get(self):
self.write('
')
def post(self):
'''
TODO: authenticate the user by your way.
'''
# If the user pass the authentication, store the session key in the memcached
name = self.get_argument("name")
session_key = "KEY:" + name
global mmc
mmc.set(session_key, str( {"name": name } ), options.expiration)
self.set_secure_cookie("session_key", session_key)
self.redirect("/")
class LogoutHandler(BaseHandler):
def get(self):
self.clear_cookie("session_key")
self.redirect("/")
settings = dict(
debug = True,
cookie_secret = "459eb8ae005b152640eef3d83a0b31a6",
login_url = "/login",
)
application = tornado.web.Application([
(r"/", MainHandler),
(r"/login", LoginHandler),
(r"/logout", LogoutHandler)
], **settings)
if __name__ == "__main__":
tornado.options.parse_command_line()
mmc = cmemcached.Client(["localhost:11211"])
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
參考資料


沒有留言:
張貼留言