【问题标题】:How to share sessions between modules on a Google App Engine Python application?如何在 Google App Engine Python 应用程序上的模块之间共享会话?
【发布时间】:2014-09-08 18:46:06
【问题描述】:

我正在尝试使用 Google App Engine 模块 (https://developers.google.com/appengine/docs/python/modules/) 在 Google App Engine 上制作一个基本应用程序,它们在模块之间共享会话信息:

模块:

  • 模块 1 - 登录页面:带有登录表单的基本页面,如果是有效用户,我创建一个会话,然后将用户重定向到仪表板页面(模块 2)
  • 模块 2 - 仪表板页面:如果模块可以读取会话变量中的数据,则显示消息的页面

问题是在仪表板模块中,在登录页面(模块 1)中创建的会话数据不存在。

是否可以访问 Google App Engine 中两个或多个模块之间的会话数据?

来源:

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

模块 1(登录)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 )

模块 2(仪表板)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 )

欢迎任何帮助,如有拼写错误,请见谅

【问题讨论】:

    标签: python google-app-engine session module


    【解决方案1】:

    默认情况下 webapp2_extra.sessions 使用基于 cookie 的会话。这些将与特定域相关联。您的模块可能位于 module1.yourapp.appspot.com 和 module2.yourapp.appspot.com(猜测)。第二个模块将无法看到第一个模块设置的 cookie。

    在您的配置中尝试设置 cookie 的域。

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

    文档说:

     - 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.
    

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

    或者您也可以使用其他后端之一,例如 memcache 或数据存储。如果您的会话包含敏感信息,这是首选。

    【讨论】:

    • 非常感谢,我用了cookie_args参数,效果很好
    • 我们如何在 java 中做到这一点?
    • @songjing 我可以在java这里解决它:stackoverflow.com/q/27725456/597657
    • 我们可以在 Go 中做类似的事情吗?
    猜你喜欢
    • 2015-02-27
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2011-02-02
    相关资源
    最近更新 更多