2012-12-29 11 views
15

Próbowałem zaimplementować sesję webapp2 GAE, ale wydaje się bardzo mało dokumentacji na jej temat. Według http://webapp-improved.appspot.com/api/webapp2_extras/sessions.html, moje kroki są następujące:GAE webapp2 sesja: poprawny proces tworzenia i sprawdzania sesji

1.Configure config i dodać do głównego aplikacji:

config = {} 
config['webapp2_extras.sessions'] = { 
    'secret_key': 'my_secret_key', 
} 
app = webapp2.WSGIApplication([...], config=config) 

2.Create sesji obsługi logowania

# Delete existent session 
    --> not mention in the tutorial 
# member is found  
self.session_store = sessions.get_store(request=handler.request) 
self.session['account'] = member.account 

3.Sprawdź jeśli sesja istnieje w różnych lokalizacjach w moim programie, należy wybrać jedną z następujących opcji: 4.Usuń sesję. 4. Usuń sesję jonowy, gdy użytkownik loguje się

--> not mentioned in the tutorial 

Moje pytania:

  1. dostałem komunikat o błędzie „... przedmiot nie ma atrybutu«sesji»” w trakcie tworzenia sesji (krok 2)

  2. Jak usunąć sesję w krokach 2 i 4?

  3. Czy ogólny proces zarządzania sesją jest prawidłowy?

Dzięki.

Odpowiedz

5

To może nie być bezpośrednia odpowiedź na to pytanie, ale jest to rozwiązanie, które znalazłem przy użyciu sesji gaesessions zamiast sesji webapp2 GAE i chciałbym się nią podzielić z kiedykolwiek ybody. Zaczynamy:

  1. Pobierz gaesessions z https://github.com/dound/gae-sessions przez przycisk "Pobierz zip" kliknięcie. Pobrany plik to "gae-sessions-master.zip".

  2. Rozpakuj plik (katalog „gae sesje-master” zostanie utworzona), a następnie skopiować katalogu „gaessions” do katalogu głównego aplikacji (czyli gdzie „app.yaml” jest)

  3. Utwórz plik o nazwie "appengine_config.py”w katalogu, z poniższej treści (forma kopiowane https://github.com/dound/gae-sessions/tree/master/demo):

    from gaesessions import SessionMiddleware 
    
    # Original comments deleted ... 
    # Create a random string for COOKIE_KDY and the string has to 
    # be permanent. "os.urandom(64)" function may be used but do 
    # not use it *dynamically*. 
    # For me, I just randomly generate a string of length 64 
    # and paste it here, such as the following: 
    
    COOKIE_KEY = 'ppb52adekdhD25dqpbKu39dDKsd.....' 
    
    def webapp_add_wsgi_middleware(app): 
        from google.appengine.ext.appstats import recording 
        app = SessionMiddleware(app, cookie_key=COOKIE_KEY) 
        app = recording.appstats_wsgi_middleware(app) 
        return app 
    
  4. Tworzenie sesji, gdy użytkownik loguje się (zmienna uwagę jest konto użytkownika):

    from gaesessions import get_current_session 
    session = get_current_session() 
    if session.is_active(): 
        session.terminate() 
    # start a session for the user (old one was terminated) 
    session['account'] = account 
    
  5. Sprawdź, czy sesja użytkownika istnieje, jeżeli tak, konta użytkownika return:

    from gaesessions import get_current_session 
    def checkSession(): 
        session = get_current_session() 
        if session.is_active(): 
         return session['account'] 
        return False 
    
  6. Usuń sesję, gdy użytkownik loguje się:

    def logout(): 
        session = get_current_session() 
        if session.is_active(): 
         session.terminate() 
    
  7. Wreszcie, można utworzyć zadanie cron czyścić sesje wygasłe okresowo:

cron.yaml:

- description: daily session cleanup 
    url: /clean_up_sessions 
    schedule: every day 3:00 
    timezone: ... (Your time zone) 

Funkcja:

from gaesessions import delete_expired_sessions 
class clean_up_sessions(webapp2.RequestHandler): 
    def get(self): 
     while not delete_expired_sessions(): 
      pass 

Mam nadzieję, że to pomaga.

+1

Dlaczego warto używać sesji gae zamiast webapp2_extras.sessions? sesje gae porównują się do kilku systemów sesyjnych, ale nie do sesji webapp2. – Romz

+0

Wielkie dzięki, Romz. Nie wiedziałem, że istnieje webapp2_extras.sessions. Dam temu szansę. –

15

Oto przykład z obsługi i jak używać webapp2 dodatkowe sesje

main.py z BaseHandler i MainHandler

import webapp2 
from webapp2_extras import sessions 

class BaseHandler(webapp2.RequestHandler):    # taken from the webapp2 extrta session example 
    def dispatch(self):         # override dispatch 
     # Get a session store for this request. 
     self.session_store = sessions.get_store(request=self.request) 

     try: 
      # Dispatch the request. 
      webapp2.RequestHandler.dispatch(self)  # dispatch the main handler 
     finally: 
      # Save all sessions. 
      self.session_store.save_sessions(self.response) 

    @webapp2.cached_property 
    def session(self): 
     # Returns a session using the default cookie key. 
     return self.session_store.get_session() 

class YourMainHandler(BaseHandler): 

    def get(self): 

     .... 
     self.session['foo'] = 'bar' 


    def post(self): 


     foo = self.session.get('foo') 

A jeśli masz login.py oddzielna:

.... other imports 
import main 

class Login(main.BaseHandler): 

    def get(self): 

     .... 
     self.session['foo'] = 'bar' 


    def post(self): 


     foo = self.session.get('foo') 
+0

Doceń swoją pomoc bardzo. Wciąż walczę, ale bez powodzenia. Załóżmy, że mam moduł "login.py" z klasą Login (webapp2.RequestHandler) do obsługi logowania użytkownika. Istnieje również główny moduł "main.py" z klasą MainPage (BaseHandler). Jak zmienić klasę Login? Importuję plik główny w pliku login.py i zmieniam Login klasy (webapp2.RequestHandler) na Login (main.BaseHandler). Komunikat o błędzie: Obiekt "module" nie ma atrybutu "BaseHandler" –

+0

Zaktualizowałem odpowiedź. – voscausa

+0

O tym właśnie mówiłem: komunikat o błędzie: obiekt 'module' nie ma atrybutu "BaseHandler" –

3

W swojej RequestHandler ręcznym dispatch: z webapp2_extras sesji importu

def dispatch(self): 

    self.session_store = sessions.get_store(request=self.request) 

    try: 
     webapp2.RequestHandler.dispatch(self) 
    finally: 
     self.session_store.save_sessions(self.response) 

i zrobić webapp2.cached_property nazywa session:

@webapp2.cached_property 
def session(self): 
    return self.session_store.get_session(backend="<whatever you want here>") 

Jeżeli chcesz uzyskać dostęp do wartości sesji, zrób self.session[<key>]

Gdy użytkownik się loguje, można zadzwonić albo:

self.auth.get_user_by_password(auth_id, password, remember=True, 
              save_session=True) 

który zadba o pozbyciu się starej sesji i tworzenia nowego dla Ciebie, lub:

self.auth.set_session(self.auth.store.user_to_dict(self.user), remember=True) 

Jeśli chodzi o wylogowaniu, wszystko co powinno być potrzeby zadzwoń:

self.auth.unset_session() 
+0

Co to jest 'self.auth'? –

Powiązane problemy