用户干扰彼此的实例

时间:2011-02-24 18:03:38

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

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

#views.py

def显示(请求):     skipped_questions = []     QUESTION_NUMBER = []     user_answer_list = []     answer_list = []     all_questions = []     如果request.method =='POST':         initial_value = 1         ID_LIST = []         结果= Questions.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。 如果我不清楚,请告诉我。

1 个答案:

答案 0 :(得分:2)

如果没有关于应用程序存储什么类型的数据以使一个会话与其他任何会话不同的具体细节,则无法为您提供任何真正有用的内容,但一种方法是将其存储在用户的user_id关键字的memcache中

完全假设的示例代码:

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,基于您刚刚添加的示例代码: 我不想在它上面提出太多要点,但你正在做的事情只是不起作用。

使用全局变量通常是一个坏主意,但在一段代码中,这是一个不可行的想法,许多不同的用户将以重叠的方式调用它。我能给你的最好建议是采取所有痛苦的全局变量(特定于特定用户),并将它们存储在特定于特定用户的字典中。我上面发布的pickling / unpickling代码是一种可行的方法,但严重的是, 直到你摆脱了那些全局变量,你的代码才会起作用。