python_way ,自定义session
container = {} #可以是数据库,可以是缓存也可以是文件 class Session: def __init__(self, handler): #handler就是之前传递过来的handler方法,所以它也会有setcookie方法。 #self.r_str 当前用户的cookie self.handler = handler self.r_str = handler.get_cookie("__session_id__") #获取客户端的cookie if self.r_str: #如果获取到cookie if self.r_str in container: #检查这个cookie是否存在在container中 #如果客户端访问的md5在我的列表中证明是真的 print("有cookie") self.r_str = self.r_str print(self.r_str)#设置一个字段,以备以后调用 else:#否则就是假的 self.cookie = client_publish.md5_str() # 先生成一个变化的cookie handler.set_cookie("__session_id__",self.cookie) #设置一个新的cookie print("假的cookie") container[self.cookie] = {} #把这个cookie放在字典中 self.r_str = self.cookie #同样因为是新生成的cookie,还是设置一个字段,以备后患 else: print("没有cookie") self.cookie = client_publish.md5_str() self.r_str = self.cookie container[self.r_str] = {} # 如果没有设置cookie,第一次访问 handler.set_cookie("__session_id__", self.r_str, expires=time.time() + 20) # 设置cookie并且设置超时时间,每次用户访问都设置一下 def set_session(self, key, value): print(container) container[self.r_str][key] = value #设置session 这样可以保存很多key和value print(container) def get_session(self): user_session = self.handler.get_cookie("__session_id__", None) if user_session in container: try: if container[user_session]["is_login"]: return True except Exception as e: print(e,"not value") return False class MyRequestHandler(tornado.web.RequestHandler): def initialize(self): #在RequestHandler中有set_cookie方法 self.key = Session(self) #我们把self传递给Session 自定义的这个类中 class HomeHadler(MyRequestHandler): def get(self): #self.set_cookie() 因为这里继承了MyRequestHandler,所以在这里也有set cookie方法 session = Session(self) user_login = session.get_session() if user_login: self.redirect("/index") #跳转到这个用户已经登陆 else: self.render("login.html") #如果这个用户没有登陆,则进入登陆页面 def post(self): user = self.get_argument("user") pwd = self.get_argument("pass") print(user, pwd) if user == "hanxu" and pwd =="123": #从数据库中查找出来的用户名密码 session = Session(self) session.set_session("is_login", True) session.set_session("user", user) self.redirect("/index") class HostHadler2(MyRequestHandler): #这种方式的话就可以方便统一使用,统一修改了 def get(self): session = Session(self) user_session = session.get_session() if user_session: self.write("主页") else: #如果没有登陆,就调回登陆页面 self.redirect("/home")
#!/usr/bin/env python3 # Created by han on 2016/10/23 import os, sys sys.path.append(os.path.dirname(os.path.abspath(__file__))) from controller import home import tornado.ioloop import tornado.web import publish import modules #配置模板路径 settings = { "template_path":"template", #自定义页面放置位置 "static_path": "static", #自定义静态文件放置位置,定义好以后在html页面中写上link标签引入静态文件才能生效 "ui_methods": publish, "ui_modules": modules, } application = tornado.web.Application([ (r"/main", home.MainHadler), ], **settings) #只需要在application这里增加setttings这个配置 application.add_handlers("cmdb.old.com",[ (r"/home", home.HomeHadler), ]) application.add_handlers("cmdb.old.com",[ (r"/main", home.CmdbHander), ]) application.add_handlers("cmdb.old.com",[ (r"/index", home.HostHadler2), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()