¿Cómo compartir sesiones entre módulos en una aplicación Python de Google App Engine?

Estoy tratando de hacer una aplicación básica en Google App Engine con dos módulos utilizando los módulos de Google App Engine ( https://developers.google.com/appengine/docs/python/modules/ ) y comparten información de sesión entre los módulos:

Módulos:

  • Módulo 1 – Página de inicio de sesión: una página básica con un formulario de inicio de sesión donde, si es un usuario válido, creo una sesión y luego el usuario es redirigido a la página del panel (Módulo 2)
  • Módulo 2 – Página del tablero: una página que muestra un mensaje si el módulo puede leer los datos en la variable de sesión

El problema es que en el módulo del panel de control los datos de sesión creados en la Página de inicio de sesión (módulo 1) no existen.

¿Es posible acceder a los datos de las sesiones entre dos o más módulos en Google App Engine?

Fuente:

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

Módulo 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 ) 

Módulo 2 (Dashboard) 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 ) 

Cualquier ayuda es bienvenida, disculpe si algo está mal escrito

Por defecto, webapp2_extra.sessions utiliza sesiones basadas en cooki. Estos estarán vinculados a un dominio específico. Sus módulos probablemente se encuentran en module1.yourapp.appspot.com y module2.yourapp.appspot.com (una conjetura). El segundo módulo no podrá ver las cookies establecidas por el primer módulo.

En su configuración intente configurar el dominio para la cookie.

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

Los docs dicen:

  - domain: Domain of the cookie. To work accross subdomains the domain must be set to the main domain with a preceding dot, eg, 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. 

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

O también puede usar uno de los otros backends como memcache o datastore. Esto es preferible si sus sesiones contienen información confidencial.