U
    
d                     @   sx   d dl Z zd dlmZ W n  ek
r8   d dlmZ Y nX d dlmZmZ d dlm	Z	 G dd dZ
G dd	 d	eZdS )
    N)force_unicode)	force_str)SessionBaseCreateError)settingsc                   @   s(   e Zd Zi Zdd Zdd Zdd ZdS )RedisServerc                 C   s   || _ d| _tjd k	rd| _tjd k	r.d| _ntjd k	r| |tj\}}t|| _t	|ddt_
t	|ddt_t	|dd	t_t	|d
d t_t	|dd t_t	|dd t_tjd k	rd| _n"tjd k	rd| _ntj
d k	rd| _|  j| j7  _d S )N sentinelconnection_objecthost	localhostporti  dbr   passwordurlZunix_domain_socket_path	redis_urlredis_unix_url
redis_host)session_keyconnection_keyr   SESSION_REDIS_SENTINEL_LISTconnection_typeSESSION_REDIS_CONNECTION_OBJECTZSESSION_REDIS_POOL
get_serverstrgetattrSESSION_REDIS_HOSTSESSION_REDIS_PORTSESSION_REDIS_DBSESSION_REDIS_PASSWORDSESSION_REDIS_URL%SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH)selfr   
server_keyserver r%   S/var/www/html/myproject/myenv/lib/python3.8/site-packages/redis_sessions/session.py__init__   s,    






zRedisServer.__init__c           	      C   s   t dd |D }d}tdddD ]}|d t||  }q"|| }t|}t|}d}d}||k r||  kr||dd k rn n||fS ||dd7 }t|}|d7 }q\d S )	Nc                 S   s   g | ]}| d dqS )weight   )get).0rowr%   r%   r&   
<listcomp>+   s     z*RedisServer.get_server.<locals>.<listcomp>r         r(   r)   )sumrangeorditernextr*   )	r"   keyZservers_poolZtotal_weightposipoolr$   r#   r%   r%   r&   r   *   s     $
zRedisServer.get_serverc              	   C   s  | j | jkr| j| j  S | jdkr2tj| j| j < n| jdkrddlm} |tjtjtj	t
tddt
tdd dtj| j| j < n| jdkrtjjtjtjd	| j| j < nh| jd
krtjtjtjtjtj	tjtjd| j| j < n2| jdkrtjtjtjtj	tjtjd| j| j < | j| j  S )Nr
   r	   r   )Sentinelr   r   )socket_timeoutretry_on_timeoutr   r   r   )r;   r   )r   r   r;   r<   r   r   r   )Zunix_socket_pathr;   r<   r   r   )r   _RedisServer__redisr   r   r   Zredis.sentinelr:   r   ZSESSION_REDIS_SOCKET_TIMEOUTZSESSION_REDIS_RETRY_ON_TIMEOUTr   Z
master_forZ#SESSION_REDIS_SENTINEL_MASTER_ALIASredisZStrictRedisZfrom_urlr    r   r   r   r   r!   )r"   r:   r%   r%   r&   r*   >   sL    





zRedisServer.getN)__name__
__module____qualname__r=   r'   r   r*   r%   r%   r%   r&   r      s   r   c                       sb   e Zd ZdZd fdd	Zdd Zdd Zd	d
 ZdddZdddZ	e
dd Zdd Z  ZS )SessionStorez2
    Implements Redis database session store.
    Nc                    s"   t t| | t| | _d S N)superrB   r'   r   r*   r$   r"   r   	__class__r%   r&   r'   l   s    zSessionStore.__init__c                 C   sB   z&| j | |  }| t|W S    d | _i  Y S X d S rC   )r$   r*   get_real_stored_key_get_or_create_session_keydecoder   _session_key)r"   Zsession_datar%   r%   r&   loadp   s    zSessionStore.loadc                 C   s   | j | |S rC   )r$   existsrH   rE   r%   r%   r&   rM   z   s    zSessionStore.existsc                 C   s>   |   | _z| jdd W n tk
r2   Y q Y nX d| _d S )NT)must_create)Z_get_new_session_keyrK   saver   modified)r"   r%   r%   r&   create}   s    

zSessionStore.createFc                 C   s   | j d kr|  S |r(| |  r(t| | j|d}tjd dkrh| j	
| |  |  | n4| j	| |  | | j	| |  |   d S )N)Zno_loadr      )r   rQ   rM   rI   r   encodeZ_get_sessionr>   VERSIONr$   setexrH   Zget_expiry_agesetZexpire)r"   rN   datar%   r%   r&   rO      s&    
zSessionStore.savec                 C   sD   |d kr| j d krd S | j }z| j| | W n   Y nX d S rC   )r   r$   deleterH   rE   r%   r%   r&   rX      s    
zSessionStore.deletec                 C   s   d S rC   r%   )clsr%   r%   r&   clear_expired   s    zSessionStore.clear_expiredc                 C   s   t j}|s|S d||gS )zIReturn the real key name in redis storage
        @return string
        :)r   ZSESSION_REDIS_PREFIXjoin)r"   r   prefixr%   r%   r&   rH      s    z SessionStore.get_real_stored_key)N)F)N)r?   r@   rA   __doc__r'   rL   rM   rQ   rO   rX   classmethodrZ   rH   __classcell__r%   r%   rF   r&   rB   h   s   




rB   )r>   Zdjango.utils.encodingr   ImportErrorr   Z%django.contrib.sessions.backends.baser   r   Zredis_sessionsr   r   rB   r%   r%   r%   r&   <module>   s   ]