当前位置: 首页 > 面试题库 >

Google App Engine-使会话与Python 2.7一起使用

黄宏旷
2023-03-14
问题内容

首先,我是GAE的新手,所以可能我用错误的方式进行操作-但是我之前使用过PHP,而会话则是保持持久性数据的方式。我正在使用Python
2.7,因为这是我在所有其他Python开发中所使用的-尽管我开始怀疑降级到2.5是否是有效的解决方案,即使不是理想的解决方案。

场景是我正在建立一个概念验证站点,并且需要有一个“虚拟”登录按钮,该按钮仅将名为 “ user” 的会话变量设置为 “ admin”
。然后,我想检查导航模板以查看是否设置了变量,如果是,我将添加一些额外的菜单命令。非常简单。 (注意:我知道这是不安全的,明智的或应做的事情-
问题是会话无法正常工作,而不是我正在使用的方法-我正在使用会话-部署后它们都不起作用)

似乎有几种不同的适用于Python的GAE会话库,我尝试了在Google搜索中最推荐使用的会话库-gaeutilities,但这会导致错误且无法正常工作(我最终偶然发现了这篇文章,以说明它只是与Python
2.7不兼容)。经过更多的搜索,我找到了来自appenginelearn.com的该库,然后我进入了该库,该库工作得很好…直到我部署了它-
然后它什么也没做。对于这可能会失败的原因,我希望提供一些指导或建议。这是我正在使用的相关代码:

我将来自appenginelearn.com的util库目录放在应用程序目录的根目录中,然后导入Session:

from util.sessions import Session

然后,我添加了Login和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('/')

以及主类中的以下(糟糕的)代码(将在演示中的所有页面上完成)

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

然后在HTML模板文件

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

以及日志中的错误:

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=/

问题答案:

您看过webapp2会话吗?全部内置,您可以立即开始使用。

https://webapp2.readthedocs.io/zh-
CN/latest/api/webapp2_extras/sessions.html

该模块为webapp2提供了轻量级但灵活的会话支持。它具有三个内置后端:安全cookie,内存缓存和数据存储。可以添加新的后端,以扩展CustomBackendSessionFactory。会话存储区可以通过SessionStore.get_session()方法使用不同的键(甚至在同一请求中使用不同的后端)提供多个会话。默认情况下,它使用配置中的默认密钥返回会话。

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

然后,围绕此构建登录系统确实很容易,似乎您已经完成了。然后,您可以将数据存储和/或内存缓存与webapp2会话结合使用,这是首选。



 类似资料:
  • 问题内容: 解决的更新: 经过所有这些工作,我发现我正在更新ajax中调用代码的旧版本。“ boardControl.php”而不是“ boardUpdate.php”这些是使编程变得有趣的错误类型。 我正在写一个浏览器gomoku游戏。我有ajax声明,允许播放器演奏一曲。 值=木板面积位置 出价=木板ID 在创建用于标识玩家身份的用户登录名之前,服务器端php有一个临时解决方案。单击时会旋转方

  • 我试图通过编写一个简单的REST应用程序来学习Spring Boot,该应用程序将登录用户()并显示当前用户的信息()。我正在使用Redis进行会话。 按预期工作:它返回主体并在浏览器和Redis中设置会话cookie。 然而,随后的请求返回。我错过了什么? : : < code > index controller . Java : :

  • 我有一个烧瓶服务器运行在http://127.0.0.1:5000和一个vuejs前端运行http://localhost:8080我已经做了api,并用postman测试了它,一切都如预期的那样工作:( > 将请求发布到/登录- (将请求发送至/登录)- 烧瓶API代码: 登录。vue: 指数vue 当我使用邮递员登录时,我得到的响应为;当我使用邮递员获取url/索引时,我得到响应。数据但当我使

  • 中描述的声明性基和ORM映射函数 映射器配置 是ORM的主要配置接口。配置映射后,持久性操作的主要使用接口是 Session . 会话基础 会议的作用是什么? 使用会话的基础知识 打开和关闭会话 构建begin/commit/rollback块 使用sessionmaker 查询(1.x样式) 查询(2.0样式) 添加新项目或现有项目 删除 冲洗 过期/刷新 使用任意WHERE子句更新和删除 自动

  • 在身份验证等情况下,与会话相比,使用JWTs有什么优势? 它是作为独立方法使用还是在会话中使用?

  • 问题内容: UPDATE 3 下面的最终工作代码。您需要src文件夹中的ace.js!从库中无法使用,您需要从其站点下载预包装的版本。 上面的代码可以设置ACE窗口的内容。 更新2 这是我的项目看起来像atm的样子,仍然在右上角显示了白色的屏幕,并带有来自WT的红色“正在加载…”消息。下面有更多注释。 当用于编辑器-> doJavaScript(command)时,“ command”变量等于以下