【问题标题】:Users interfering with each others instances用户互相干扰实例
【发布时间】:2011-02-24 18:03:37
【问题描述】:

在我的谷歌应用程序引擎上的多项选择测验节目项目中,多个用户一旦登录就可以同时使用网络应用程序。但是由于某种原因,它们会干扰彼此的实例。 场景示例:假设用户 A 想要使用 10 个问题的问答节目,同时用户 B 想要在另一台机器上运行 10 个问题的问答节目。但是由于他们同时使用该应用程序,所以他们每个人只得到 5 个问题,而且他们的结果变得一团糟。 有人知道如何避免吗?到目前为止,我没有使用任何会话或 cookie。这是解决方案还是其他? 谢谢

#views.py

def 显示(请求): 跳过的问题=[] 问题号码=[] user_answer_list=[] answer_list=[] 所有问题=[] 如果 request.method=='POST': 初始值=1 id_list=[] 结果=问题.objects.all() 对于我的结果: id_value=i.id id_list.append(id_value)

    data=request.POST.copy()
    total_question=data['number_of_question']
    mytime=data['time']
    seconds=59
    minutes=int(mytime)-1
    already_questions=Random_model.objects.all().delete()
    already_answers=User_answer.objects.all().delete()
    random_questions_list=random.sample(id_list,int(total_question))
    for i in random_questions_list:
        random_model=Random_model()
        random_model.list_id=i
        random_model.initial_value=int(initial_value)
        random_model.save()
        initial_value+=1
    question_list=1
    a=Random_model.objects.get(initial_value=question_list)
    new_question=Questions.objects.get(id=a.list_id)
    template_value={ 'output': new_question,'minutes':minutes,'seconds':seconds,'question_list':question_list }
    return render_to_response("quiz.html",template_value)

Followup-@Adam:嗨,我已经删除了全局变量,当我独自在笔记本电脑上工作时,程序再次运行良好。但是,当我要求我的同事从他的一端尝试时,我们都得到了相同的问题并干扰了彼此的会话,因为最终输出变得混乱。我开始使用 gae-sessions 并且能够使用 request.session 但在这种情况下我应该如何使用 gae-sessions。 如果我不清楚,请告诉我。

【问题讨论】:

  • 请记住,对 AppEngine 应用程序的请求仍然只是 HTTP 请求,因此是无状态的。您将不得不做一些事情来区分一个请求和另一个请求。
  • 您是否为此目的使用会话?我真的觉得我需要从视图中查看相关代码。
  • 向我们展示您如何将问题与用户联系起来!
  • 仁慈的代码耶稣!这么多全局变量!
  • @SRC:使用全局变量是完成你想做的事情的错误方法。你应该把所有这些地球仪存储到字典中的等效数据中。然后在需要访问该数据的所有函数之间传递字典。

标签: python django google-app-engine django-nonrel


【解决方案1】:

如果没有一些具体的细节来说明你的应用程序存储了什么样的数据来使一个会话与其他会话不同,就不可能给你任何真正有用的东西,但是一种方法是将它存储在 memcache 中,以用户的 user_id 为键.

完全假设的示例代码:

def get_session_data():
    from google.appengine.api import users

    found_session = None

    user = users.get_current_user()
    if user:
        from google.appengine.api import memcache

        users_session = memcache.get(user.user_id())


    return found_session

def save_session_data(session_object):
    from google.appengine.api import users
    from google.appengine.api import memcache

    memcache.set(users.get_current_user().user_id(), serialized_object)

现在,在您开始剪切和粘贴之前,这种方法有很多注意事项,并且仅作为建议的起点。 Memcache 不能保证将项目保存在内存中,还有许多其他竞争实现在某些方面会更可靠。

从根本上说,我建议使用 cookie 来存储会话数据,但 AppEngine 不支持 cookie,因此您必须找到它们的实现并将其包含在您的代码中。 Google Code 上有许多很好的实现。

这里有一些提供 cookie 支持的库可供选择。还有更多。

gae-utilities

gae-sessions

app-engine-oil

FOLLOWUP,基于您刚刚添加的示例代码: 我不想说得太细,但是你正在做的事情行不通。

使用全局变量通常是一个坏主意,但在一段代码中,它会被许多不同的用户以重叠的方式调用,这尤其是一个不可行的主意。我能给你的最好建议是获取所有痛苦的全局变量(这些变量确实特定于特定用户),并将它们存储在特定于特定用户的字典中。我在上面发布的酸洗/取消酸洗代码是一种可行的方法,但说真的,除非你摆脱这些全局变量,否则你的代码将无法工作。 p>

【讨论】:

  • @Adam Crossland:首先感谢您并为没有准确定义问题而道歉。从上个月开始学习 Django 和 GAE,所以有点新 :-) 我会为 django 更多地检查泡菜和 cookie- nonrel,因为我正在使用它。
  • @Adam Crossland:谢谢。将根据您的建议更正代码并尽快更新。
  • 很好的答案,但我建议使用现有的会话库,而不是使用 memcache - 或者至少使用数据存储。
  • App Engine 的 memcache 实现实际上会为您执行酸洗,如果您将它传递给一个可腌制对象而不是一个字符串,因此可以稍微简化一下。
  • @Adam:忘记关闭问题。经过一番努力,GAE 会议成功了。感谢您的宝贵时间!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 2013-05-09
相关资源
最近更新 更多