Правильный способ сделать обработку сессий в Python + Pylons для программиста php - PullRequest
1 голос
/ 06 октября 2010

Я программист php, который только начинает работать с Python.Я пытаюсь заставить Python обрабатывать вход / выход через сеансы, хранящиеся в базе данных.Вещи работают, но кажутся противоречивыми.Например, иногда пользователь не вышел из системы.Иногда пользователи «переключают» логины.Я предполагаю, что это как-то связано с безопасностью потоков, но я просто не знаю, с чего начать, как это исправить.Любая помощь будет оценена.Вот что у меня сейчас:

#lib/base.py

def authenticate():
#Confirm login
 try:
     if user['authenticated'] != True:
         redirect_to(controller='login', action='index')
 except KeyError:
     redirect_to(controller='login', action='index')

#Global variables
user = {}
connection = {}

class BaseController(WSGIController):

#Read if there is a cookie set
     try:
         session = request.cookies['session']

         #Create a session object from the session id
         session_logged_in = Session(session)

         #If the session is valid, retrieve the user info
         if session_logged_in.isValid(remote_addr):

             #Set global variables about the logged in user
             user_logged_in = User(session_logged_in.user_id)
             user['name'] = c.name = user_logged_in.name
             user['name_url'] = c.name_url = user_logged_in.name_url
             user['first_name'] = c.first_name = user_logged_in.first_name
             user['last_name'] = c.last_name = user_logged_in.last_name
             user['email'] = c.email = user_logged_in.email
             user['about'] = c.about = user_logged_in.about
             user['authenticated'] = c.authenticated = True
             user['profile_url'] = c.profile_url = user_logged_in.profile_url 
             user['user_thumb'] = c.user_thumb = user_logged_in.user_thumb
             user['image_id'] = c.image_id = user_logged_in.image_id
             user['id'] = c.user_id = user_logged_in.id

             #Update the session
             session_logged_in.current_uri = requested_url
             session_logged_in.update()

     #If no session has been set, do nothing
     except KeyError:
         user['authenticated'] = False

Затем я могу получить доступ к пользователю {} global с моих контроллеров:

#controllers/profile.py
from project.lib.base import BaseController, user
class ProfileController(BaseController):

    def index(self, id=None, name_url=None):

        #If this is you
         if user['id'] == 1
             print 'this is you'

Есть ли лучший способ сделать это?Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 06 октября 2010

У пилонов есть объект 'сессий', который существует для обработки подобных ситуаций. пример на сайте Pylons, кажется, соответствует тому, что вы хотите.

Я думаю, что вы видите проблемы из-за глобальных «user» и «connection». Pylons имеет объект globals , который предназначен для обмена информацией между всеми контроллерами и не сбрасывается при каждом запросе.

...