2013-03-08 45 views
10

Tôi rất bối rối trước vấn đề mà tôi có, tôi ước ai đó có thể chỉ ra sai lầm của tôi.Django: Chuyển hướng đến trang hiện tại sau khi phương thức POST hiển thị cảnh báo đăng lại

Tôi có phương thức trong views.py giới hạn đối với mẫu có biểu mẫu trong đó. Mã này trông như thế này:

def template_conf(request, temp_id): 
    template = ScanTemplate.objects.get(id=int(temp_id)) 
    if request.method == 'GET': 
     logging.debug('in get method of arachni.template_conf')  
     temp_form = ScanTemplateForm(instance=template)) 
     return render_response(request, 'arachni/web_scan_template_config.html', 
           { 
           'template': template, 
           'form': temp_form, 
           }) 
    elif request.method == 'POST': 
     logging.debug('In post method') 
     form = ScanTemplateForm(request.POST or None, instance=template) 
     if form.is_valid(): 
      logging.debug('form is valid') 
      form.save() 
      return HttpResponseRedirect('/web_template_conf/%s/' %temp_id) 

Hành vi của trang này là thế này: khi tôi nhấn "submit" nút, chương trình đi vào chi nhánh POST, và thực hiện thành công tất cả mọi thứ trong chi nhánh. Sau đó, HttpResponseRedirect chỉ chuyển hướng đến trang hiện tại (url đó là url hiện tại, tôi cho rằng phải bằng .). Sau đó, chi nhánh GET đã được thực hiện kể từ khi tôi chuyển hướng đến trang hiện tại và trang đã trả về thành công. Tuy nhiên, nếu tôi làm mới trang tại thời điểm này, trình duyệt sẽ trả về một cảnh báo xác nhận:

The page that you're looking for used information that you entered. 
Returning to that page might cause any action you took to be repeated. 
Do you want to continue? 

Nếu tôi xác nhận, dữ liệu bài sẽ được đăng tải vào backend một lần nữa. Có vẻ như trình duyệt vẫn đang giữ dữ liệu POST trước đó. Tôi không biết tại sao điều này xảy ra, xin vui lòng giúp đỡ. Cảm ơn.

+0

+1 Tôi gặp vấn đề tương tự. Tôi có mã tương tự như bạn, nhưng nó chỉ có vẻ hoạt động chính xác trong Firefox. –

+0

@KevinDiTraglia: Ồ, tôi đã không thử firefox trước đây, nhưng có vẻ như firefox DOES làm công việc. Vì vậy, lẻ ...... –

+0

@KevinDiTraglia đó là một lỗi trong Chrome 25, xem câu trả lời của tôi dưới đây. – Alasdair

Trả lời

2

Nếu hành động biểu mẫu của bạn được đặt thành ".", Bạn không cần thực hiện chuyển hướng. Cảnh báo trình duyệt không nằm trong tầm kiểm soát của bạn để ghi đè. Mã của bạn có thể được đơn giản hóa rất nhiều:

# Assuming Django 1.3+ 
from django.shortcuts import get_object_or_404, render_to_response 

def template_conf(request, temp_id): 
    template = get_object_or_404(ScanTemplate, pk=temp_id) 
    temp_form = ScanTemplateForm(request.POST or None, instance=template) 

    if request.method == 'POST': 
     if form.is_valid(): 
      form.save() 
      # optional HttpResponseRedirect here 
    return render_to_response('arachni/web_scan_template_config.html', 
      {'template': template, 'form': temp_form}) 

Điều này sẽ đơn giản duy trì mô hình của bạn và hiển thị lại chế độ xem. Nếu bạn muốn chuyển hướng HttpResponse sang chế độ xem khác nhau sau khi gọi .save(), điều đó sẽ không làm cho trình duyệt cảnh báo bạn rằng dữ liệu POST phải được gửi lại.

Ngoài ra, không cần thiết, và thực hành không tốt, để mã hóa cứng các mẫu URL mà bạn sẽ thực hiện chuyển hướng đến. Sử dụng phương thức reverse từ django.core.urlresolvers. Nó sẽ làm cho mã của bạn dễ dàng hơn nhiều để cấu trúc lại sau này, nếu các URL của bạn cần phải thay đổi.

+0

Cảm ơn rất nhiều vì đề xuất của bạn. Đã học hỏi được rất nhiều. Một câu hỏi: là 'render' phương pháp mới trong Django 1.4? Tôi hiện đang cài đặt 1.3. –

+0

Có, kết xuất chỉ khả dụng trong phiên bản 1.4.x +. Nếu bạn đang sử dụng 1,3, bạn sẽ cần sử dụng render_to_response. – Brandon

+0

Tôi đã cập nhật mẫu mã cho khả năng tương thích Django 1.3.x – Brandon

7

Có vẻ như bạn đang gặp phải lỗi trong Chrome 25 (xem Chromium issue 177855) đang xử lý việc chuyển hướng xử lý không chính xác. Nó đã được sửa trong Chrome 26.

Mã ban đầu của bạn là chính xác, mặc dù nó có thể được đơn giản hóa một chút như Brandon gợi ý. Tôi khuyên bạn nên làmredirect after a successful post request, vì nó ngăn người dùng vô tình gửi lại dữ liệu (trừ khi trình duyệt của họ có lỗi!).

+0

Không bao giờ là quá muộn để trả lời câu hỏi! Cảm ơn bạn đã cung cấp thông tin và xác nhận với mã của tôi. +1 –

Các vấn đề liên quan