阻止用户访问django中的后续url

时间:2014-09-18 10:05:23

标签: python django

我有一个表单,用户输入问题的答案。如果答案是正确的,用户将被重定向到下一个问题。

我遵循的网址模式是, 127.0.0.1:8000/question/1

127.0.0.1:8000/question/2等等。

我将表单发布到验证发生的同一视图。但是没有表单验证,用户可以访问后续的url和以前的url。现在不处理用户的注册。任何用户都可以参加测验。那么在这种情况下如何阻止用户直接访问网址?

我知道这是一个简单的基本问题。在django的新手通过构建东西来学习。有什么帮助?。

提前致谢

{% extends 'base.html' %}

{% block title %}{% endblock %}

{% block body_block %}

            <p><strong>Your question {{ quesno_id.id}} of {{ total_ques }}: </strong></p>
            "{{ question.que }}"
            <p><strong>Type your answer here :</strong></p>
            <form id='song_form' method = 'post' action="">{% csrf_token %}
                {% for hidden in form.hidden_fields %}
                    {{ hidden }}
                {% endfor %}

                {% for field in form.visible_fields %}
                    {{ field.errors }}
                    {{ field.help_text }}
                    {{ field }}
                {% endfor %}
                <br></br>
                <input type ="submit" name="submit" value="Submit"/>
            </form>

    {% endblock %}

def display_question(request,question_id):
    context = RequestContext(request)
    try:
        quesno_id = {'id':question_id}
        data = data.objects.get(id=question_id)
        total_ques = data.objects.all().count()
    except data.DoesNotExist:
        pass   

    if request.method == 'POST':
        form = que_form(request.POST)
        if form.is_valid():    
            user_answer = form.cleaned_data['answer']
            if data.name.strip() == user_answer.strip():
                if int(question_id) < int(total_ques):
                    return HttpResponseRedirect("/question/%s/" % (int(question_id)+1))
                else:
                    return HttpResponse('Game over')
            else:
                return HttpResponse("Your answer is wrong")
        else:
            print form.errors
    else:
        form = que_form()
    return render_to_response('display_question.html',{'form':form,'data':data,'quesno_id':quesno_id,'total_ques':total_ques},context)

from django import forms  
class que_form(forms.Form):
     answer = forms.CharField(widget=forms.TextInput())

3 个答案:

答案 0 :(得分:2)

Django在django.contrib.formtools中包含一个名为form wizard的工具,似乎符合您的需要。它使用表单中的会话/ cookie来验证表单页面是否以正确的顺序访问。您可能想要了解它是如何工作的,或者只是使用可用的东西而无需自己处理。

如果您想/需要自己实现,最简单的方法可能是会话。在回答问题时在会话中设置标记:

request.sessions['question_{}_answered'.format(question_id)] = True

并在渲染下一个问题时检查是否已回答所有先前的问题。有点像...

for qid in range(1, question_id):
    if 'question_{}_answered'.format(qid) not in request.sessions:
        return HttpResponseRedirect('/question/1/')
# Really renders the question page
return render_to_response(...)

答案 1 :(得分:1)

我提供来自同一网址的所有问题,即删除&#34; /&#34;部分在最后 - 现在用户无法修改URL以获得任何其他问题。对于GET请求,您可以在数据库中查询第一个未答复的问题(我假设您存储了所有答案)并显示该问题。

答案 2 :(得分:1)

所以,有一些事情:第一,我没有看到你通过&#34;问题&#34;到你的模板,但你称之为(&#34; question.que&#34;)。我也没有看到你使用&#34;数据&#34;你要经过的。我假设您的意思是使用数据而不是问题?

无论如何,你能做的就是这样:

 if data.name.strip() == user_answer.strip():
     if int(question_id) < int(total_ques):
         return render_to_response('display_question.html', {'form':form,'data':data,'quesno_id':quesno_id,'total_ques':total_ques},context)
     else:
         return HttpResponse('Game over')
 else:
     return HttpResponse("Your answer is wrong")

并且您可以将问题ID从表单来回传递给视图函数,并在问题得到正确回答时在视图函数中递增。

更新:

我不确定这是否有效:您的评论,但您可以尝试在display.html中使用javascript。类似的东西:

  <script>
     $("#text-box").val("");
  </script>

我的想法是,当你重新渲染到响应时它会执行......