2017-12-08 10 views
0

djangoを初めて使用して、予定リストページを作成しています。入力テキストボックスにテキストを入力してEnterキーを押すと、CSRFエラーが表示されます。私はこれが重複している可能性が高いことを知っていますが、フォーラムやドキュメントの多くを読んだ後、私はまだこの問題を抱えています。私が試したことは次のとおりです。Django 1.11 - csrf_tokenテンプレートタグを持っているにもかかわらず、CSRF検証に失敗しました

私は{% csrf_token %}テンプレートタグをフォームタグの中に持っています。

設定のMIDDLEWAREセクションに'django.middleware.csrf.CsrfViewMiddleware'があります。

CSRF_COOKIE_SECURE = FalseがDjango 1.11のデフォルトです。 httpsではなくhttpを使用しています。

私はビュー内でrender()機能を使用しています。

Firefoxのプライバシー設定は、サードパーティのCookieを許可するように設定されています。 Chromeでも動作しません。

formタグにenctype="text/plain"タグを使用していません。

私はreleaseのこの抜粋に従うことにcontext dictを供給しようとしました:

home.html

<!DOCTYPE html> 
<html> 
    <head> 
     <title>To-do List</title> 
    </head> 
    <body> 
     <h1>To-do List</h1> 
     <form method="POST"> <!--tried adding action="" as well--> 
      <input name="item_text" id="id_new_item" placeholder="Enter a to-do list item" /> 
      {% csrf_token %} 
     </form> 
     <table id="id_table"> 
      <tr><td>{{ new_item_text }}</td></tr> 
     </table> 
    </body> 
</html> 

のURL:

enter image description here

は、ここに私のコードです。 py

from django.conf.urls import url 
from django.contrib import admin 
from lists import views 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^$', views.home_page, name='home') 
] 

settings.py

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

views.py

from django.shortcuts import render 
from lists.models import Item 

def home_page(request): 
    if request.method == 'POST': 
     Item.objects.create(text=request.POST['item_text']) 
     return redirect('/') 

    items = Item.objects.all() 
    return render(request, 'lists/home.html', {'items': items}, {}) 

models.py

from django.db import models 

class Item(models.Model): 
    text = models.TextField(default='') 
+0

を使用して... recomendationはあなたのPOST値を検証するためにforms.py使用です。 – eddwinpaz

+0

はビュー上で 'csrf_exempt()'デコレータを使うので、csrfトークンなしで動作します。これは非常に危険であり、運用環境ではこれを使用しないでください。あなたが立ち往生しているので、これはあなたを助けるかもしれません。これは一時的な解決策です – Stack

+0

ブラウザの開発者ツールでGETリクエストとPOSTリクエストのヘッダをチェックした場合、 'Cookie:token = 'の 'csrftoken'は同じですか?それは同じでなければなりません。同じでない場合、セッションは要求間で変更されます。変更しないでください。 – Borut

答えて

0

また、テンプレートタグ

を使用せずに直接トークンCSRFを渡すことができます
from django.core.context_processors import csrf 
from django.shortcuts import render 


def home_page(request): 
    c = {} 
    c.update(csrf(request)) 

    if request.method == 'POST': 
     Item.objects.create(text=request.POST['item_text']) 
     return redirect('/') 

    items = Item.objects.all() 
    return render(request, 'lists/home.html', {'items': items, 
               'csrf':c}) 
テンプレートタグの

は、単にあなたのコードはOKのようです

<input type='hidden' name='csrfmiddlewaretoken' value='{{csrf}}' /> 
+0

私はこれが時代遅れだと言及しなければならない。csrfテンプレートタグを使用する必要がありますが、これは回避するための古い方法です。 – eddwinpaz

関連する問題