python会话_python会话?

这个博客介绍了一种在Python中实现CGI会话管理的方法。作者创建了一个名为CGISession的类,使用临时文件存储会话数据,并通过MD5、SHA256或SHA512进行哈希确保安全性。类提供了设置、获取、删除参数以及清除和删除会话的功能,同时使用文件锁确保了多进程间的并发安全。
摘要由CSDN通过智能技术生成

这可能是一个老问题,但我面临着同样的问题:Python中没有内置的会话支持。我编写了一个简单的会话处理程序,可能对某些人有用:#!/usr/bin/python

# -*- coding: utf-8 -*-

import tempfile

import hashlib

import os

import time

import random

import errno

import ast

import pprint

import fcntl

class CGISession:

__sessionfile = ''

__newid = ''

__date = ''

__tmp = ''

__pid = ''

__time = ''

__rand = ''

__pp = pprint.PrettyPrinter()

__fs = ''

def __init__(

self,

id=None,

directory=None,

hash='md5',

):

if directory is None:

self.__directory = tempfile.gettempdir()

else:

if not os.path.exists(directory):

try:

os.makedirs(directory)

except OSError, error:

if error.errno != errno.EEXIST:

raise

self.__directory = directory

if hash not in ['md5', 'sha256', 'sha512']:

self.__hash = 'md5'

else:

self.__hash = hash

if id is None:

self.__id = self.__genSessionID()

self.__fs = open(os.path.join(self.__directory,

'pycgiession_{0}'.format(self.__id)), 'w')

fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)

self.__fs.write('{}')

self.__fs.close()

self.__sessionfile = os.path.join(self.__directory,

'pycgiession_{0}'.format(self.__id))

os.chmod(self.__sessionfile, 0640)

else:

try:

open(os.path.join(self.__directory,

'pycgiession_{0}'.format(os.path.basename(id))),

'r').close()

self.__id = os.path.basename(id)

self.__sessionfile = os.path.join(self.__directory,

'pycgiession_{0}'.format(self.__id))

os.chmod(self.__sessionfile, 0640)

except IOError, error:

if error.errno == errno.ENOENT:

self.__id = self.__genSessionID()

self.__fs = open(os.path.join(self.__directory,

'pycgiession_{0}'.format(self.__id)), 'w')

fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)

self.__fs.write('{}')

self.__fs.close()

self.__sessionfile = os.path.join(self.__directory,

'pycgiession_{0}'.format(self.__id))

os.chmod(self.__sessionfile, 0640)

else:

raise

def __genSessionID(self):

self.__pid = str(os.getpid())

self.__time = ''.join(map(str, time.gmtime()[0:]))

self.__rand = str(random.random())

if self.__hash == 'sha256':

sha256 = hashlib.sha256()

sha256.update(self.__pid)

sha256.update(self.__time)

sha256.update(self.__rand)

self.__newid = sha256.hexdigest()

elif self.__hash == 'sha512':

sha512 = hashlib.sha512()

sha512.update(self.__pid)

sha512.update(self.__time)

sha512.update(self.__rand)

self.__newid = sha512.hexdigest()

else:

md5 = hashlib.md5()

md5.update(self.__pid)

md5.update(self.__time)

md5.update(self.__rand)

self.__newid = md5.hexdigest()

return self.__newid

def getID(self):

return self.__id

def setParam(self, key, value):

self.__fs = open(self.__sessionfile, 'r')

fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)

self.__date = self.__fs.readlines()

self.__fs.close()

self.__fs = open(self.__sessionfile, 'w')

fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)

self.__date = ast.literal_eval(self.__date[0])

self.__date[key] = value

self.__fs.write(self.__pp.pformat(self.__date))

self.__fs.close()

def getParam(self, key):

self.__fs = open(self.__sessionfile, 'r')

fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)

self.__date = self.__fs.readline()

self.__fs.close()

self.__date = ast.literal_eval(self.__date)

try:

self.__date = self.__date[key]

return self.__date

except KeyError:

return None

def getAll(self):

self.__fs = open(self.__sessionfile, 'r')

fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)

self.__date = self.__fs.readlines()

self.__fs.close()

self.__date = ast.literal_eval(self.__date[0])

return self.__date

def delParam(self, key):

self.__fs = open(self.__sessionfile, 'r')

fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)

self.__date = self.__fs.readlines()

self.__fs.close()

self.__fs = open(self.__sessionfile, 'w')

fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)

self.__date = ast.literal_eval(self.__date[0])

try:

del self.__date[key]

except KeyError:

pass

self.__fs.write(self.__pp.pformat(self.__date))

self.__fs.close()

def clear(self):

self.__fs = open(self.__sessionfile, 'w')

fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)

self.__fs.write('{}')

self.__fs.close()

def delete(self):

os.remove(self.__sessionfile)

示例:

^{pr2}$

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值