4

私はDjangoバージョン1.4.2に取り組んでいます。私はこの単純なフォームの例を実装しました(djangobookからインスピレーションを得ています):

# views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.mail import send_mail
from mysite.contact.forms import ContactForm

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(request, 'contact_form.html', {'form': form})

# 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 }}
            {% csrf_token %}
        </table>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

# forms.py

from django import forms

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

私が試したすべてのブラウザ(chrome、maxthon、firefox)ですべてが正常に機能しますが、IE9ではHTTP403が拒否されます。

それを引き起こしているものについての手がかりはありますか?

編集:詳細な調査の結果、問題はこれに起因することがわかりました。空のフォームを要求すると、ナビゲーターはcsrf cookieを受け取りますが、不明な理由により、フォームを投稿するときにこのcookieを送り返しません。この問題は、Cookieがpythonanywhere.comのnginxサーバーからのものである場合にのみ発生するようです。自分のApacheサーバーからテストすると、Cookieは正常に返送されます。

サーバーからキャプチャされた2つのヘッダーは次のとおりです。

HTTP/1.1 200 OK
Server: nginx/1.2.5
Date: Wed, 21 Nov 2012 13:56:31 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Cookie
Set-Cookie: csrftoken=1AJjzkbUgJdKAmkbiHicJ3or2Mfi6AbD; expires=Wed, 20-Nov-2013 13:56:31 GMT; Max-Age=31449600; Path=/

HTTP/1.1 200 OK
Date: Wed, 21 Nov 2012 13:56:50 GMT
Server: Apache/2.2.15 (CentOS)
Vary: Cookie
Set-Cookie:  csrftoken=2iMZSH1s0vJnEt4tRRY7FciT1Q7orrVF; expires=Wed, 20-Nov-2013 13:56:50 GMT; Max-Age=31449600; Path=/
Keep-Alive: timeout=180, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8

唯一の重要な違いは、apacheからのKee-Aliveヘッダーのようです...

あなたはそれがそこから来ることができると思いますか?

4

2 に答える 2

2

{% csrf_token %}タグを出力し<input type="hidden" ...>ますが、セル内ではなく、テーブルの直接の子であるため、おそらく IE9 はそれを無視します。

{% csrf_token %}すぐ隣に移動してみてください<input type="submit" value="Submit">

于 2012-11-20T23:32:55.363 に答える