2017-03-24 11 views
1

私のサーバー上のプロダクションモードでのみ発生するCSRF_Tokenエラーが表示されなくなりました。しかし、runserverコマンドを使用してコンピュータの端末から実行しているときは、すべてがうまく動作します。私はこれに関連する他の多くの質問を、運がないと読んだ。私の場合は、他のものとは多少異なると思われます。なぜなら、ローカルではあるが生産ではないからです。Django CSRFトークンがプロダクションのみに存在しません

views.pyの「送信」に送信するAjaxフォームを送信するとエラーが発生します。誰がこれを引き起こしているのか知っていますか?また、プロダクションモードで私のクッキーを見ると、CSRF_Tokenはそこにも始まって​​いません。ローカルです。助けてくれてありがとう。ここで

のAjaxに関する用語の私のviews.py

from django.shortcuts import render 

from django.http import HttpResponse 


def index(request): 

    return render(request, 'index.html') 


def submit(request): 
    #Receive Request 
    inputone = request.POST['randominfo'] 
    inputtwo = request.POST['randominfo2'] 

    #Some more code here that setups response. 
    #Deleted since Im posting to StackOverflow 

    return response 

コードは、この問題を修正し

$(function() { 
    $.ajaxSetup({ 
     headers: { "X-CSRFToken": getCookie("csrftoken") } 
    }); 
}); 

function getCookie(c_name) 
{ 
    if (document.cookie.length > 0) 
    { 
     c_start = document.cookie.indexOf(c_name + "="); 
     if (c_start != -1) 
     { 
      c_start = c_start + c_name.length + 1; 
      c_end = document.cookie.indexOf(";", c_start); 
      if (c_end == -1) c_end = document.cookie.length; 
      return unescape(document.cookie.substring(c_start,c_end)); 
     } 
    } 
    return ""; 
} 
function submitAjax(event){ 

     $.ajax({ 
      type:'POST', 
      url:'/submit/', 
      data:{ 
       randominfo:document.getElementById('Random').innerHTML, 
       randominfo2:document.getElementById('Random2').innerHTML, 

      }, 
      dateType: 'json', 
      success:function() { 
        # Url here 

      } 

     }) 
    }; 

ソリューションを提出しています。

はviews.pyで「django.views.decorators.csrf輸入ensure_csrf_cookieから」追加して、あなたがしているので、Ajaxフォーム

+0

理由だけではなく、あなたのテンプレートに '' {%csrf_token%}を置く代わりに、直接のクッキーからそれを取得しようとしていませんか? –

+0

私が試したことのないことがあります。悪い報告をする。ありがとう –

答えて

1

エラーocursを含まhtmlファイルを返すビューの上にある「@ensure_csrf_cookie」

<form id="id" name="form"> 
    {% csrf_token %} 
    <!-- Form body here --> 
</form> 
:CSRFトークンを設定していない、我々はいくつかの詳細全ての

ファーストをチェックする必要があり、これを防ぐために、あなたはあなたのhtmlであなたは次のようにいくつかを設定する必要があり、フォームにCSRFトークンを設定する必要があります

第2に、thリクエストヘッダはokですへのE CSRFクッキー、私はjqueryのを使用する方法serialize

data: $("#your-form-id").serialize()

、代わりにあなたが1で、あなたのデータフィールド1を設定することを示唆している私は、Ajaxについては、このpostを読むためにあなたをお勧めしたいと思います

0

非常に有用であるジャンゴとの要求を行うことができます2つのことがあります。

1)あなたのAJAX呼び出しにCSRFトークンを提出します。あなたはそれを得るためにgetCookie() JavaScript関数を使用する必要があります。幸いにもdjangoのドキュメントhas some codeあなたはコピーして貼り付けることができます。 javascriptの

$.ajax({ 
     type:'POST', 
     url:'/submit/', 
     data:{ 
      randominfo:document.getElementById('Random').innerHTML, 
      randominfo2:document.getElementById('Random2').innerHTML, 
      'csrfmiddlewaretoken': getCookie('csrftoken'), // add this 
... 

2)あなた/提出ビューのCSRFを無効にします。あなたはデコレータでこれを行うことができます。これは安全性が低いため、機密データがないことを確認してください。

views.py:

from django.views.decorators.csrf import csrf_exempt 
... 
@csrf_exempt 
def your_submit_view(request): 
    #view code 
関連する問題