关于tornado中session的总结
生活随笔
收集整理的這篇文章主要介紹了
关于tornado中session的总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import tornado.web
import tornado.ioloop
container = {}
# container是一個儲存在服務端包含客戶端相關信息的字典,以鍵值對的形式存在
class Session:
def __init__(self, handler):
self.handler = handler
# Session(self),self為Indexhandler實例化之后的對象
self.random_str = None
def __genarate_random_str(self):
# 生成隨機字符串,由于生成隨機字符串的代碼都是一樣的,所以可以抽象出來單獨作為一個函數
# 需要生成隨機字符串的時候調用這個函數就返回一個經過加密的隨機字符串
import hashlib
import time
obj = hashlib.md5()
obj.update(bytes(str(time.time()), encoding='utf-8'))
random_str = obj.hexdigest()
return random_str
def __setitem__(self, key, value):
# 當類的對象 obj["random_str"]="key-value的值" 自動執行這個函數
# 總的來說,服務端先檢測客戶端有沒有隨機字符串,這里隨機字符串是cookie的值
# 而隨機字符串的value對應的是session的key
# 如果客戶端沒有隨機字符串,則生成一個新的隨機字符串
# 如果客戶端有隨機字符串,
# 檢查該隨機字符串服務端的session有沒有,有先不做操作
# 如果服務端沒有這個隨機字符串,則執行__genarate_random_str()生成新的隨機字符串
# 并把該隨機字符串作為session的key值
# 當然前提條件是你已經通過身份驗證才會有以上的操作
if not self.random_str:
# 首先客戶端發請求過來并要設置session里面的key-value值的時候觸發__setitem__
# 一開始self.random_str為None,
# 服務端先檢測客戶端有沒有名為'__session__'的鍵值對(cookie)
random_str = self.handler.get_cookie('__session__')
# 如果此時random_str為None,即客戶端沒有名為'__session__'的cookie
# 執行__genarate_random_str()生成隨機字符串
# 并把該隨機字符串作為session的key值
if not random_str:
random_str = self.__genarate_random_str()
container[random_str] = {}
# 然后此處按理來說應該為客戶端設置key為'__session__',value為隨機字符串的cookie
else:
# 如果此時客戶端有名為'__session__'的cookie,
# 那么我們就要檢測這個隨機字符串是否存在于session里面
if random_str in container.keys():
pass
else:
# 如果不存在,就重新創造一個新的字符串并加入到session里
random_str = self.__genarate_random_str()
container[random_str] = {}
self.random_str = random_str
container[self.random_str][key] = value
self.handler.set_cookie("__session__", self.random_str)
def __getitem__(self, key):
# 當客戶端請求manage頁面,需要通過session驗證
# 如果服務端拿到類隨機字符串,則服務端把該字符串所對應的相關信息發送給瀏覽器端
random_str = self.handler.get_cookie("__session__")
if not random_str:
return None
user_info_dict = container.get(random_str, None)
if not user_info_dict:
return None
value = user_info_dict.get(key, None)
return value
class BaseHandler(tornado.web.RequestHandler):
def initialize(self):
self.session = Session(self)
# 只要實例初始化都會執行這個函數
# self.session為session這個類的對象,通過self.session可以訪問session這個類的屬性和方法
class IndexHandler(BaseHandler):
def get(self):
if self.get_argument("u", None) in ["alex", "eric"]:
# 判斷用戶密碼是否正確,只有用戶密碼正確了才能夠設置session
self.session["is_login"] = True
# 自動觸發__setitem__,在__setitem__里面直接完成隨機字符串的檢驗,
# 生成,cookie的生成,session的設置
self.session["name"] = self.get_argument("u", None)
print(container)
self.write("cookie設置成功了")
else:
self.write("請登錄")
class ManaggerHandler(BaseHandler):
def get(self, *args, **kwargs):
print(container)
# print(self.get_cookie("__session__"))
val = self.session["is_login"]
# 自動觸發__getitem__
if val:
self.write(self.session["name"] + "登錄成功")
else:
self.write("登錄失敗")
# 圖片驗證碼
class CheckCodeHandler(BaseHandler):
def get(self, *args, **kwargs):
# 生成 圖片并且返回
import io
import check_code
mstream = io.BytesIO()
img, code = check_code.create_validate_code()
# 將圖片對象寫入mstream,
img.save(mstream, "GIF")
# 為每個用戶保存期驗證碼
self.session["CheckCode"] = code
self.write(mstream.getvalue())
class LoginHandler(BaseHandler):
def get(self, *args, **kwargs):
self.render('login.html', status="")
def post(self, *args, **kwargs):
user = self.get_argument('user', None)
pwd = self.get_argument('pwd', None)
code = self.get_argument('code', None)
check_code = self.session["CheckCode"]
if code.upper() == check_code.upper():
self.write('驗證碼正確')
else:
# self.redirect('/login')
self.render('login.html', status='驗證碼錯誤')
# csrf
class CsrfHandler(BaseHandler):
def get(self, *args, **kwargs):
self.render('csrf.html')
def post(self, *args, **kwargs):
self.write('csrf.post')
settings = {
"template_path": "views",
"static_path": "Statics",
"static_url_prefix": "/Statics/",
"cookie_secret": "abcdef",
'xsrf_cookies': True
}
application = tornado.web.Application([
(r"/index", IndexHandler),
(r"/manager", ManaggerHandler),
(r"/login", LoginHandler),
(r"/check_code", CheckCodeHandler),
(r"/csrf", CsrfHandler),
], **settings)
if __name__ == '__main__':
application.listen(9000)
tornado.ioloop.IOLoop.instance().start()
# _*_ coding:utf-8 _*_
import tornado.web
import tornado.ioloop
container = {}
# container是一個儲存在服務端包含客戶端相關信息的字典,以鍵值對的形式存在
class Session:
def __init__(self, handler):
self.handler = handler
# Session(self),self為Indexhandler實例化之后的對象
self.random_str = None
def __genarate_random_str(self):
# 生成隨機字符串,由于生成隨機字符串的代碼都是一樣的,所以可以抽象出來單獨作為一個函數
# 需要生成隨機字符串的時候調用這個函數就返回一個經過加密的隨機字符串
import hashlib
import time
obj = hashlib.md5()
obj.update(bytes(str(time.time()), encoding='utf-8'))
random_str = obj.hexdigest()
return random_str
def __setitem__(self, key, value):
# 當類的對象 obj["random_str"]="key-value的值" 自動執行這個函數
# 總的來說,服務端先檢測客戶端有沒有隨機字符串,這里隨機字符串是cookie的值
# 而隨機字符串的value對應的是session的key
# 如果客戶端沒有隨機字符串,則生成一個新的隨機字符串
# 如果客戶端有隨機字符串,
# 檢查該隨機字符串服務端的session有沒有,有先不做操作
# 如果服務端沒有這個隨機字符串,則執行__genarate_random_str()生成新的隨機字符串
# 并把該隨機字符串作為session的key值
# 當然前提條件是你已經通過身份驗證才會有以上的操作
if not self.random_str:
# 首先客戶端發請求過來并要設置session里面的key-value值的時候觸發__setitem__
# 一開始self.random_str為None,
# 服務端先檢測客戶端有沒有名為'__session__'的鍵值對(cookie)
random_str = self.handler.get_cookie('__session__')
# 如果此時random_str為None,即客戶端沒有名為'__session__'的cookie
# 執行__genarate_random_str()生成隨機字符串
# 并把該隨機字符串作為session的key值
if not random_str:
random_str = self.__genarate_random_str()
container[random_str] = {}
# 然后此處按理來說應該為客戶端設置key為'__session__',value為隨機字符串的cookie
else:
# 如果此時客戶端有名為'__session__'的cookie,
# 那么我們就要檢測這個隨機字符串是否存在于session里面
if random_str in container.keys():
pass
else:
# 如果不存在,就重新創造一個新的字符串并加入到session里
random_str = self.__genarate_random_str()
container[random_str] = {}
self.random_str = random_str
container[self.random_str][key] = value
self.handler.set_cookie("__session__", self.random_str)
def __getitem__(self, key):
# 當客戶端請求manage頁面,需要通過session驗證
# 如果服務端拿到類隨機字符串,則服務端把該字符串所對應的相關信息發送給瀏覽器端
random_str = self.handler.get_cookie("__session__")
if not random_str:
return None
user_info_dict = container.get(random_str, None)
if not user_info_dict:
return None
value = user_info_dict.get(key, None)
return value
class BaseHandler(tornado.web.RequestHandler):
def initialize(self):
self.session = Session(self)
# 只要實例初始化都會執行這個函數
# self.session為session這個類的對象,通過self.session可以訪問session這個類的屬性和方法
class IndexHandler(BaseHandler):
def get(self):
if self.get_argument("u", None) in ["alex", "eric"]:
# 判斷用戶密碼是否正確,只有用戶密碼正確了才能夠設置session
self.session["is_login"] = True
# 自動觸發__setitem__,在__setitem__里面直接完成隨機字符串的檢驗,
# 生成,cookie的生成,session的設置
self.session["name"] = self.get_argument("u", None)
print(container)
self.write("cookie設置成功了")
else:
self.write("請登錄")
class ManaggerHandler(BaseHandler):
def get(self, *args, **kwargs):
print(container)
# print(self.get_cookie("__session__"))
val = self.session["is_login"]
# 自動觸發__getitem__
if val:
self.write(self.session["name"] + "登錄成功")
else:
self.write("登錄失敗")
# 圖片驗證碼
class CheckCodeHandler(BaseHandler):
def get(self, *args, **kwargs):
# 生成 圖片并且返回
import io
import check_code
mstream = io.BytesIO()
img, code = check_code.create_validate_code()
# 將圖片對象寫入mstream,
img.save(mstream, "GIF")
# 為每個用戶保存期驗證碼
self.session["CheckCode"] = code
self.write(mstream.getvalue())
class LoginHandler(BaseHandler):
def get(self, *args, **kwargs):
self.render('login.html', status="")
def post(self, *args, **kwargs):
user = self.get_argument('user', None)
pwd = self.get_argument('pwd', None)
code = self.get_argument('code', None)
check_code = self.session["CheckCode"]
if code.upper() == check_code.upper():
self.write('驗證碼正確')
else:
# self.redirect('/login')
self.render('login.html', status='驗證碼錯誤')
# csrf
class CsrfHandler(BaseHandler):
def get(self, *args, **kwargs):
self.render('csrf.html')
def post(self, *args, **kwargs):
self.write('csrf.post')
settings = {
"template_path": "views",
"static_path": "Statics",
"static_url_prefix": "/Statics/",
"cookie_secret": "abcdef",
'xsrf_cookies': True
}
application = tornado.web.Application([
(r"/index", IndexHandler),
(r"/manager", ManaggerHandler),
(r"/login", LoginHandler),
(r"/check_code", CheckCodeHandler),
(r"/csrf", CsrfHandler),
], **settings)
if __name__ == '__main__':
application.listen(9000)
tornado.ioloop.IOLoop.instance().start()
轉載于:https://www.cnblogs.com/liangweixiong/p/6418052.html
總結
以上是生活随笔為你收集整理的关于tornado中session的总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 胎梦梦到豹子是男孩还是女孩
- 下一篇: 梦到和死人打架有什么预兆