2014-07-17 8 views
8

próbuję uczynić podstawową aplikację na Google App Engine z dwóch modułów wykorzystujących Google App Engine moduły (https://developers.google.com/appengine/docs/python/modules/) i Dzielą informacje o sesji między modułami:Jak udostępniać sesje między modułami w aplikacji Google App Engine Python?

modułów:

  • Moduł 1 - Strona logowania: podstawowa strona z formularzem logowania, gdzie jeśli jest prawidłowym użytkownikiem Tworzę sesję, a następnie użytkownik jest przekierowywany na stronę deski rozdzielczej (Moduł 2)
  • Moduł 2 - Strona Pulpitu Dashboard: strona wyświetlająca komunikat moduł może odczytać dane w zmiennej sesji

Problem polega na tym, że w module deski rozdzielczej dane sesji utworzone na stronie logowania (moduł 1) nie istnieją.

Czy jest możliwy dostęp do danych sesji między dwoma lub więcej modułami w Google App Engine?

Źródło:

baseHandler.py

import webapp2 
from webapp2_extras import sessions 

class BaseHandler(webapp2.RequestHandler): 

    def render_template(self, view_filename, params=None): 
     params = {} 
     path = os.path.join(os.path.dirname(__file__), 'views', view_filename) 
     self.response.out.write(template.render(path, params)) 

    def display_message(self, message): 
     """Utility function to display a template with a simple message.""" 
     params = {} 
     self.render_template('message.html', params) 

    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() 

Moduł 1 (signin) main.py

from google.appengine.ext import ndb 
import webapp2 
from webapp2_extras.security import hash_password 

import logging 
import os 
import sys 
import jinja2 

from src.basehandler import BaseHandler 
from src.user import User 

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)), 
    extensions=['jinja2.ext.autoescape'] 
) 

class MainPage(BaseHandler): 

    def get(self): 
     template_values = {} 
     template = JINJA_ENVIRONMENT.get_template('templates/index.html') 
     self.response.write(template.render(template_values)) 


    def post(self): 
     email_address = self.request.get('input-email') 
     password = self.request.get('input-password') 

     password = hash_password(password, 'sha1', salt=None, pepper=None) 

     qry = User.query(
      ndb.AND(User.email_address == email_address, 
        User.password == password 
      ) 
     ).fetch() 

     if qry: 
      self.session['loggedin'] = True 
      self.redirect('http://dashboard.myURL.appspot.com/') 

     else: 
      self.redirect('/?error=invaliduser') 

config = {} 
config['webapp2_extras.sessions'] = { 
    'secret_key': 'my-super-secret-key', 
} 

app = webapp2.WSGIApplication([ 
    ('/', MainPage) 
], debug=True, config=config) 

Moduł 2 (panel) main.py

from google.appengine.ext import ndb 
import webapp2 

import logging 
import os 
import sys 
import jinja2 

from src.basehandler import BaseHandler 
from src.user import User 

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)), 
    extensions=['jinja2.ext.autoescape'] 
) 

class Main(BaseHandler): 

    def get(self): 
     msg = '' 

     if not self.session.get('loggedin'): 
      msg = 'There is not session' 

     else: 
      msg = 'There is a session' 

     template_values = { 'msg': msg } 
     template = JINJA_ENVIRONMENT.get_template('templates/index.html') 
     self.response.write(template.render(template_values)) 

config = {} 
config['webapp2_extras.sessions'] = { 
    'secret_key': 'my-super-secret-key', 
} 

app = webapp2.WSGIApplication([ 
    ('/', Main) 
], debug=True, config=config) 

Każda pomoc jest mile widziane, przepraszam, jeśli coś jest błędnie

Odpowiedz

8

Domyślnie webapp2_extra.sessions wykorzystuje sesje Cooki oparte. Będą one powiązane z określoną domeną. Twoje moduły są prawdopodobnie na module1.yourapp.appspot.com i module2.yourapp.appspot.com (przypuszczenie). Drugi moduł nie będzie mógł zobaczyć plików cookie ustawionych przez pierwszy moduł.

W swojej konfiguracji spróbuj ustawić domenę dla pliku cookie.

config['webapp2_extras.sessions'] = { 
    'secret_key': 'my-super-secret-key', 
    cookie_args': { 
     'domain' : "yourapp.appspot.com" 
} 

Docs powiedzieć:

- domain: Domain of the cookie. To work accross subdomains the 
    domain must be set to the main domain with a preceding dot, e.g., 
    cookies set for `.mydomain.org` will work in `foo.mydomain.org` and 
    `bar.mydomain.org`. Default is None, which means that cookies will 
    only work for the current subdomain. 

od: https://code.google.com/p/webapp-improved/source/browse/webapp2_extras/sessions.py

Albo można też użyć jednej z pozostałych backendów jak memcache lub magazynu danych. Jest to preferowane, jeśli sesje zawierają poufne informacje.

+0

Dziękuję bardzo, użyłem parametru cookie_args i działa idealnie – Wilcho

+2

Jak możemy to zrobić w Javie? – songjing

+0

@songjing Byłem w stanie rozwiązać go w 'java' tutaj: http://stackoverflow.com/q/27725456/597657 –