2017-04-06 13 views
2

私はDjangoのView関数から値を返そうとしています。その関数はAjaxを使ってJavsScriptコードから呼び出されていますが、 'Forbidden(CSRF token missing or incorrect)'というエラーがスローされます。「CSRFトークンが見つからないか正しくありません」というエラーが表示されるのはなぜですか?

JavaScript/Ajax

The Error message

HTMLコードは次のようなものになります。

<div align="center" class="input-line"> 
    <form class="input-form" method="post">{% csrf_token %} 
     <input type = "text" id = "ans" class = "form-control" name = "address" placeholder="Type postcode..."><br><br> 
     <button id = "homeBtn" class="btn btn-primary">Find info</button><br><br> 
    </form> 
</div> 

をビュー機能は次のとおりです。

def result(request): 
     if(request == 'POST'): 
      param = request.form['my data'] 
      this = runAreaReview(param) #This returns a string 
      return HttpResponse(this) 
+0

[クロスサイトリクエスト偽造](https://en.wikipedia.org/wiki/Cross-site_request_forgery)、特にそれを保護する「Cookie-to-Header Token」の方法をお読みになることをお勧めします。 – Quietust

答えて

2

方法1

投稿リクエストをajaxで行うには、HTTP_X_CSRFTOKENというヘッダーを設定し、その値をブラウザに名前csrftokenで保存されているクッキーに設定する必要があります。 Reference。 あなたのajaxコールでは、このようなことをする必要があります。

var csrftoken = Cookies.get('csrftoken'); 
$.ajax(
    ... 
    headers:{"HTTP_X_CSRF_TOKEN":csrftoken} 
); 

はまた、あなたがnginxのようなもので、いくつかのリバースプロキシサーバーを使用している場合は、Djangoのアプリケーションにも同様にこのヘッダを偏屈することを確認していることに注意してください。アノテーションを使用して、この特定のビューのためにCSRFの検証を無効にすることができ

方法2

Reference

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def result(request): 
    ... 

方法3

以下の方法は、あなたがalwawsはあなただけ構築している場合は、それを取り除くために設定でCSRFミドルウェアをターンオフすることができ、セキュリティ上の理由

にはお勧めしませんレクリエーション目的のためのものであり、生産のためのものではありません。

+0

ご意見ありがとうございます。私は** csrf_exempt **を使用しましたが、もうエラーは発生しません。 しかし、** View関数がオブジェクトを返さなかったというエラーをスローします。代わりにNoneを返しました** 私は自分のビュー機能を投稿自体にリンクしていますが、なぜこれが起こっているのでしょうか? –

+0

'request.method ==" POST "' –

+0

でチェックしてください。また、デバッガでIDEを使うことをお勧めします。それはあなたがそれを修正するのに役立つので、問題を特定するのに役立ちます。 :) –

関連する問題