Google App Engine-Getting Sessions working with Python 2.7

Po pierwsze, jestem zupełnie nowy w GAE, więc możliwe, że robię to w niewłaściwy sposób - ale wcześniej używałem PHP i sesja była tym, jak przechowywałem trwałe DANE. Używam Pythona 2.7, ponieważ to jest to, czego używam do wszystkich moich innych rozwoju Pythona - chociaż zaczynam się zastanawiać, czy obniżenie wersji do 2.5 może być poprawnym rozwiązaniem, jeśli nie idealnym.

Scenariusz jest taki, że buduję stronę proof-of-concept I muszę mieć "atrapę" przycisku logowania, który po prostu ustawia zmienną sesji nazywa się 'user' z wartością 'admin' . Następnie chcę sprawdzić w szablonie nawigacji, aby zobaczyć, czy zmienna jest ustawiona, a jeśli tak, dodam kilka dodatkowych poleceń menu. Bardzo proste. (Uwaga: wiem, że to nie jest bezpieczne, sensowne lub cokolwiek, co powinno być zrobione - problem w tym, że sesja nie działa, a nie to, co z nią robię - robię kilka innych rzeczy w kodzie przy użyciu sesji - żadna z nich nie działa, gdy jest wdrożona)

Wydaje się, że jest kilka różne biblioteki sesji dla Gae z Pythonem i próbowałem ten, który był najbardziej zalecane w wyszukiwaniach Google- gaeutilies, Ale To spowodowało błędy i nie działa (w końcu natknąłem się na ten post aby wyjaśnić, że jego po prostu nie jest kompatybilny z Pythonem 2.7). Trochę więcej poszukiwań doprowadziło mnie do tej biblioteki z appenginelearn.com które wrzuciłem i zadziałało idealnie... dopóki go nie rozmieściłem-wtedy nic nie robi. Z przyjemnością. wskazówki lub porady, dlaczego może to zawodzić. Oto odpowiedni kod, którego używam:

Wstawiłem katalog biblioteki util z appenginelearn.com w katalogu głównym aplikacji, a następnie zaimportowana sesja:

from util.sessions import Session

Potem dodałem klasy Login i Logout:

class LogIn(webapp2.RequestHandler):
    def get(self):
        self.session = Session()
        self.session['user'] = 'admin'
        # Return the user to the page they logged in from
        referer = self.request.environ['HTTP_REFERER'] \
                if 'HTTP_REFERER' in self.request.environ \
                else '/'
        self.redirect(referer)

class LogOut(webapp2.RequestHandler):
    def get(self):
        self.session = Session()
        self.session.delete_item('user')
        self.redirect('/')

I poniższy (okropny) kod w głównej klasie (będzie to zrobione dla wszystkich stron w demo)

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.session = Session()
        logging.info('Main page fired up')
        if 'user' in self.session:
            user = self.session['user']
        else:
            user = None

        template_values = {
            'user': user
            }
        template = jinja_environment.get_template('main.html')
        self.response.out.write(template.render(template_values))

I to w pliku szablonu HTML

  {% if user %}
      <p>Welcome, {{user}}</p>
  {% endif %}

I błędy w log:

2012-10-04 02:51:28.084 /login 302 143ms 0kb Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4
*ip address removed* - - [04/Oct/2012:02:51:28 -0700] "GET /login HTTP/1.1" 302 136 "*site-removed*" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4" "*site-removed*" ms=144 cpu_ms=0 cpm_usd=0.000015 instance=*instance removed*
**I** 2012-10-04 02:51:28.080
Creating session session-*session number removed*
**E** 2012-10-04 02:51:28.084
Set-Cookie: appengine-simple-session-sid=*session number removed*; Path=/
Author: Community, 2012-10-05

1 answers

Czy widziałeś sesje webapp2? Wszystko jest wbudowane i możesz zacząć od razu.

Https://webapp2.readthedocs.io/en/latest/api/webapp2_extras/sessions.html

Ten moduł zapewnia lekką, ale elastyczną obsługę sesji dla webapp2. Posiada trzy wbudowane backendy: bezpieczne pliki cookie, memcache i datastore. Można dodać nowe backendy rozszerzające CustomBackendSessionFactory. Magazyn sesji może udostępniać wiele sesji przy użyciu różnych kluczy, nawet używając różnych backendów w tym samym żądaniu, za pomocą metody SessionStore.get_session (). Domyślnie zwraca sesję przy użyciu domyślnego klucza z konfiguracji.

import webapp2

from webapp2_extras import sessions

class BaseHandler(webapp2.RequestHandler):
    def dispatch(self):
        # Get a session store for this request.
        self.session_store = sessions.get_store(request=self.request)

        try:
            # Dispatch the request.
            webapp2.RequestHandler.dispatch(self)
        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()

# To set a value:
self.session['foo'] = 'bar'

# To get a value:
foo = self.session.get('foo')

Wtedy naprawdę łatwo jest zbudować system logowania wokół tego, wygląda na to, że już to zrobiłeś. I możesz korzystać z magazynu danych i / lub memcache z sesjami webapp2, zgodnie z preferencjami.

 19
Author: Paul Collingwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-21 16:04:14