10

私が抱えている問題にとても混乱しているので、誰かが私の間違いを指摘してくれることを願っています.

views.py に、フォームを含むテンプレートにバインドするメソッドがあります。コードは次のようになります。

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)

このページの動作は次のとおりです。「送信」ボタンを押すと、プログラムはブランチに入り、POSTブランチ内のすべてを正常に実行しました。次に、HttpResponseRedirect現在のページへの唯一のリダイレクト (その URL は現在の URL です。 と等しいはずです.)。GET現在のページにリダイレクトしてからそのブランチが実行され、ページが正常に返されました。ただし、この時点でページを更新すると、ブラウザーは確認の警告を返します。

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?

確認すると、投稿データがバックエンドに再度投稿されます。ブラウザがまだ以前の POST データを保持しているようです。なぜこれが起こるのかわかりません、助けてください。ありがとう。

4

2 に答える 2

7

Chrome 25 のバグ ( Chromium issue 177855を参照) に遭遇したようです。このバグは、リダイレクトの処理を正しく処理していません。Chrome 26 で修正されました。

元のコードは正しいですが、ブランドンが提案するように少し簡略化できます。post リクエストが成功した後にリダイレクトすること をお勧めします。これにより、ユーザーが誤ってデータを再送信するのを防ぐことができます (ブラウザーにバグがない限り!)。

于 2013-03-10T15:32:24.033 に答える
2

フォーム アクションが「.」に設定されている場合、リダイレクトを行う必要はありません。ブラウザの警告は、オーバーライドすることはできません。コードを大幅に簡素化できます。

# 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})

これにより、モデルが永続化され、ビューが再レンダリングされます。を呼び出した後にHttpResponse Redirect をのビューに実行したい場合.save()、ブラウザは POST データを再送信する必要があることを警告しません。

また、リダイレクト先の URL パターンをハードコーディングする必要はありませんし、それは良い習慣でもありません。django.core.urlresolversのreverseメソッドを使用します。URL を変更する必要が生じた場合に、後でコードをリファクタリングしやすくなります。

于 2013-03-08T17:01:49.360 に答える