在线启用本地禁用

时间:2017-03-04 13:40:55

标签: html google-app-engine

我的简单应用程序旨在从禁用按钮开始,然后在用户成功完成任务时更改为启用。这适用于本地,但不适用于已部署的应用。在已部署的应用程序上,按钮启动。

Python代码:

pbndata = ''

class MainPage(BaseHandler):

    def get(self):
    global pbndata
    logging.info("pbn pbndata length in get: %s " % len(pbndata))
    if len(pbndata) > 0:
        buttonclass = 'button'
    else:
        buttonclass = 'button disabled'
    template_values = {'buttonclass':buttonclass}
        template = JINJA_ENVIRONMENT.get_template('index.html')
        self.response.out.write(template.render(template_values))

模板代码:

{% extends "base.html" %}
{% block content %}

<div id="boards" style="margin: auto;max-width: 700px; position: relative;  top: 0px; background-color: #808080" >
<div class="flex-container">
  <div class="flex-item">
  </div>
  <div class="flex-item middle">(0) Supply your .pbn URL</div>
  <div class="flex-item">
    <form action=""   method="Post">
    <button  
        id="Deal" class="{{ buttonclass }}" style="display: inline-block;background-color: #0000ff; float:right"
        {% if buttonclass == "button disabled" %}
        disabled
        {% endif %}
        >
    Deals
    </button>
</form>

  </div>
</div>
</div>

在线view-source注意省略了disabled属性:

    <form action=""   method="Post">
    <button  
        id="Deal" class="button" style="display: inline-block;background-color: #0000ff; float:right"

        >
    Deals
    </button>
</form>

本地view-source注意到属性disabled存在:

<form action=""   method="Post">
    <button  
        id="Deal" class="button disabled" style="display: inline-block;background-color: #0000ff; float:right"

        disabled

        >
    Deals
    </button>
</form>

2 个答案:

答案 0 :(得分:2)

pbndata是一个模块级变量。 App Engine模块在实例启动时初始化,并保留在内存中,直到实例终止。 pbndata的值可能只有在第一个访问者&#34;完成任务&#34;之后才为空,并且从那时起将非空。

请注意,如果您有多个活动实例,则每个实例都会加载模块的不同副本,因此pbndata的值在每个实例上都会有所不同。

如果您希望在不实施登录系统的情况下维护每用户状态(即每个用户的不同pbndata),则解决方案是setretrieve个Cookie。您可以将pbndata的值存储在Cookie中。

这很容易实现但不安全,因为恶意用户可能会篡改存储在cookie中的值。更安全的方法是将pbndata的值存储在session中,并将会话密钥存储在cookie中。

答案 1 :(得分:0)

即使退出打开的浏览器并再次浏览链接,我也无法使用代码强制我的应用重新初始化。如果连接已经死了几个小时似乎有效,因为那么gae可能会重新初始化应用程序。但我想要一个可靠的重置。

所以我选择了一种复活节彩蛋解决方案,因为正常使用该应用程序不需要重新初始化。我将应用的另一个模板中的链接从已注释的<a >链接更改为下面显示的<form >帖子。

<!--a href="/" style="background-color: #808080" target="_self">New boards</a-->
<form action="" method="Post">
  <button id="Newboards" class="button" style="display: inline-block;background-color: #808080; float:left" >
    New Boards
  </button>
  <input type="hidden" id="newboard" name="newboard" value="True" />
</form>
<!--a href="/" style="background-color: #808080" target="_self">New boards</a-->

然后在python中我修改了以下Post定义,根据需要重置pbndata的值。

   def post(self):
    global Cards
    global Suits
    global pbndata
        newboard = self.request.get('newboard', None)
    if newboard:
        pbndata=''
        return webapp2.redirect('/')
    Cards = self.request.get('Cards')
    Suits = self.request.get('Suits')
    return webapp2.redirect('/elsewhere')

这是一个复活节彩蛋,因为它是一个无证件(对大多数用户来说是不必要的)功能。