3

「The Django Book」に取り組んで Django を学ぼうとしていますが、CSRF 保護に問題があります。ここで多くの提案を見つけましたが、どれもうまくいかないようです。

Chrome を使用すると、次のメッセージが表示されますCSRF token missing or incorrect
Internet Explorer を使用すると、次のメッセージが表示されますCSRF cookie not set

settings.py でコメントアウトする'django.middleware.csrf.CsrfViewMiddleware'と、すべてが機能するように見えます (もちろん、偽のアドレスには何もメールされませんが)。csrf_protectビューにデコレータを配置しようとしましたが、役に立ちません。また、への呼び出しをコメントアウトしようとしましたがsend_mail、それでも CSRF エラーが発生するため、どうやら問題を引き起こしているのは ContactForm です。

(私はdjango 1.4.1を使用しています。)

私は何をする必要がありますか?

ビュー.py

from django.shortcuts import render_to_response
from django.http import HttpResponse, HttpResponseRedirect
from contact.forms import ContactForm
from django.template import RequestContext
from django.core.mail import send_mail

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            send_mail(
                cd['subject'],
                cd['message'],
                cd.get('email', 'noreply@example.com'),
                ['siteowner@example.com'],
            )
            return HttpResponseRedirect('/contact/thanks/')
    else:
        form = ContactForm()
    return render_to_response('contact_form.html', {'form': form}, context_instance=RequestContext(request))

def thanks(request):
    return HttpResponse("Thanks for the feedback")

フォーム.py

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField()
    email = forms.EmailField(required=False)
    message = forms.CharField()

contact_form.html

<html>
<head>
    <title>Contact us</title>
</head>
<body>
    <h1>Contact us</h1>

    {% if form.errors %}
        <p style="color: red;">
            Please correct the error{{ form.errors|pluralize }} below.
        </p>
    {% endif %}

    <form action="" method="post">
        <table>
            {{ form.as_table }}
        </table>
        <input type="submit" value="Submit">
    </form>
</body>
</html>  
4

1 に答える 1

5

csrf 保護が必要な場合は、{% csrf_token %}タグをフォームに入れます。

csrf 保護が必要ない場合は@csrf_exempt、ビューの上部にデコレータをインポートして配置します (ドキュメントを参照してください)。

于 2012-12-28T19:53:49.537 に答える