2014-01-13 81 views
3
from django.shortcuts import get_object_or_404, render 
from django.http import HttpResponseRedirect, HttpResponse 
from django.core.urlresolvers import reverse 
from polls.models import Choice, Poll 

def vote(request, poll_id): 
    p = get_object_or_404(Poll, pk=poll_id) 
try: 
    selected_choice = p.choice_set.get(pk=request.POST['choice']) 
except (KeyError, Choice.DoesNotExist): 
    # Redisplay the poll voting form. 
    return render(request, 'polls/detail.html', { 
     'poll': p, 
     'error_message': "You didn't select a choice.", 
    }) 
else: 
    selected_choice.votes += 1 
    selected_choice.save() 
    # Always return an HttpResponseRedirect after successfully dealing 
    # with POST data. This prevents data from being posted twice if a 
    # user hits the Back button. 
    return HttpResponseRedirect(reverse('polls:results', args=(p.id,))) 

這幾天我在學習Django框架。我無法理解 爲什麼重定向對於處理POST數據之後的安全性很重要。 其實有一個關於它的解釋,上面有如下的評論。爲什麼在處理POST數據後重定向很重要?

# Always return an HttpResponseRedirect after successfully dealing 
# with POST data. This prevents data from being posted twice if a 
# user hits the Back button. 

可能有人可以解釋爲什麼更多的詳細原因我是一個初學者是 知道一些;(提前

謝謝:)

+0

請參閱[Post/Redirect/Get - wikipedia](http://en.wikipedia.org/wiki/Post/Redirect/Get)。 – falsetru

+0

這不是爲了安全 - 在成功發佈後防止惡意用戶發送重定向的模式中沒有任何問題。這是爲了您的用戶的方便,特別是防止一些意外的雙重意見或意外狀態的提交,如鏈接所述。我並不反對這個參考文獻 - 我只是想強調一下,爲了安全起見,您必須記住隨時可以提交任何類型的請求和任何數據,並且您的服務器端應用程序必須適當地處理潛在的惡意數據。 –

回答

0

這意味着用戶可以通過發佈多次點擊F5(Back-Sumbit)(Back-Sumbit)(Back-Sumbit)

如果不是返回重定向?

我認爲它可以幫助防止灌溉。

+0

我認爲,它的評論。 –