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