2010-01-14 3 views
1

Est-ce que Python a une fonctionnalité de session ou pas?Session en python?

Si c'est le cas, alors comment puis-je utiliser ceci et quelle bibliothèque dois-je utiliser?

+0

demandez-vous d'un framework web? Quel framework web utilisez-vous? Python a des dizaines. –

Répondre

2

Beaker est très populaire pour les applications web Python basées sur WSGI, mais vous devez comprendre que Python est un langage de programmation polyvalent, il n'est pas orienté à 100% vers le web comme PHP.

Il serait également utile si vous avez inscrit plus d'informations sur l'application dont vous avez besoin dans.

3

Certains frameworks Python offrent le concept de « session ». (Le langage Python lui-même, bien sûr, n'a rien à voir avec ça!).

Par exemple, Beaker est un excellent middleware WSGI léger qui prend en charge les sessions; puisque WSGI est généralement le meilleur moyen de connecter n'importe quel framework web Python à n'importe quel serveur web, et bien sûr vous pouvez toujours insérer un middleware WSGI dans les transactions WSGI, Beaker (comme tout autre middleware WSGI) est très largement applicable.

+0

Merci ... que pensez-vous de l'API mod_python? est-ce vraiment utile dans mon application. effectivement ce que je veux faire est. une variable de session stocke ma valeur d'authentification de connexion quelle qu'elle soit et transmet cette valeur avant d'exécuter tout autre script. mon script vient d'être appelé script wrapper ... j'espère avoir bien expliqué et vous comprenez ce que je veux savoir? –

+0

@Rahul, je pense que WSGI est bien meilleur que mod_python: il ne vous relie pas à un seul serveur web, et vous permet de "brancher" de nombreux modules middleware utiles - y compris ceux sur l'authentification et sur les sessions; ** très ** modulaire et flexible - et vous pouvez toujours choisir quel serveur ** et ** quel cadre vous aimez, tout à fait indépendamment. –

+0

Oui, je n'utiliserais mod_python pour rien aujourd'hui ... beaucoup trop de lock-in. WSGI est là où il est et mod_wsgi est une bonne implémentation rapide. – bobince

5

Cela peut être une vieille question, mais j'ai rencontré le même problème qu'il n'y a pas de prise en charge de session intégrée en Python. J'ai écrit un gestionnaire simple session qui pourrait être utile pour quelqu'un:

#!/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) 

Exemples:

>>> from CGISession import CGISession 
>>> session = CGISession() 
>>> 
>>> session.getID() 
'7e487c3c300126fddbecb37b041d66e3' 
>>> 
>>> session.setParam('name','A') 
>>> session.setParam('friends',['C','D','E']) 
>>> 
>>> session.getParam('name') 
'A' 
>>> session.getParam('friends') 
['C', 'D', 'E'] 
>>> 
>>> session.delParam('name') 
>>> session.delParam('friends') 
>>> 
>>> session.getParam('name') 
>>> session.delParam('friends') 
>>> 
>>> session.delete() 
>>> 
Questions connexes