玩蛇记-给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()
參考資料


97A8131FF4
回覆刪除For those interested in the latest updates and resources, I recommend visiting https://dtfhub.com/. It's a valuable platform where you can find a wide range of information and tools to enhance your projects. Exploring this site can provide insights that are both practical and innovative. Make sure to check it out for comprehensive content tailored to your needs.