day40

session / cookies :

  • 会话跟踪技术是Cookie与Session
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。

Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。

Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足

HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

查看某个网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert (document. cookie)
    Cookie具有不可跨域名性
    浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。
    
    
    
session :    增加了服务器的存储压力。
session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

ession对象是在客户端第一次请求服务器的时候创建的。Session也是一种key-value的属性对

为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

单列模式 :

class sql:
    
    __instance =None
    def __new__(cls,*args,**kwargs):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance
    
	@classmethod
	def singleton(cls):
        if not cls.__instance:
            cls.__instance = cls()
        return cls.__instance

优酷的客服端和服务端的 scoket 连接

#youku_client
import socket
from db import session_data
from conf import settings
import struct
session_data.mutex = Lock()
def get_client():
    client = socket.socket()
    client.connect(
    	(setting.ip,settings.port))
	return client
def send_and_back(send_dic,client):
    json_data = json.dumps(send_dic).encode('utf-8')
    headers = struct.pack('i',len(json_data))
    client.send(headers)
    client.send(json_data)
    
    headers = client.recv(4)
    data_len = struct.unpack('i',headers)[0]
    json_data = client.recv(data_len).decode('utf-8')
    back_dic = json.loads(json_data)
	return back_dic


#youku_server
server = socket.socket()
server.bind(
	(setting.ip,settings.port))
server.listen(5)
func_dic = {
    'register':admin_api.register_api,
}
pool = ThreadPoolExecutor(100)
def run():
    print('启动服务器...')
    while True:
        conn,addr= server.accept()
        print(addr)
        
        pool.submit(working,conn,addr)
def dispatcher(back_dic,conn):
    type = back_dic.get('type')
    
    if type in func_dic:
        func_dic.get(type)(back_dic,conn)
        
def working(conn,addr):
    while True:
        try:
            headers = conn.recv(4)
            data_len = struct.unpack('i',headers)[0]
            json_data = conn.recv(data_len).decode('utf-8')
            
            back_dic = json.loads(json_data)
            back_dic['addr'] = str(addr)
            dispatcher(back_dic,conn)
		except Exception as e:
            print(e)
            session_data.mutex.acquire()
            session_data.session_dict.pop(str(addr))
            session_data.mutex.release()
            break
            
原文地址:https://www.cnblogs.com/shaozheng/p/11808779.html