日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于tornado中session的总结

發布時間:2023/11/29 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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()

轉載于:https://www.cnblogs.com/liangweixiong/p/6418052.html

總結

以上是生活随笔為你收集整理的关于tornado中session的总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。