2017-04-06 621 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

我建議讀一讀[Cross-Site Request Forryry](https://en.wikipedia.org/wiki/Cross-site_request_forgery),特別是保護它的「Cookie-to-Header Token」方法。 – Quietust

回答

2

方法1

對於使用ajax發送發佈請求,您需要設置一個名爲HTTP_X_CSRFTOKEN的標頭,並將其值設置爲存儲在瀏覽器中的名爲csrftoken的cookie。 Reference。 所以在你的ajax調用中,你應該這樣做。

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

也注意到,如果你正在使用的東西,如一些nginx的反向代理服務器,確保乖謬的這個頭,以及在Django應用程序。

方法2

可以通過使用註釋停用CSRF驗證該特定視圖。 Reference

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def result(request): 
    ... 

方法3

下面的方法不是出於安全考慮,

可以alwaws倒胃口的設置,以擺脫它的CSRF中間件,如果你只是建立用於休閒目的而非生產。

+0

感謝您的建議。我使用** csrf_exempt **,它不會再拋出該錯誤。 但是現在它會拋出一個錯誤,指出** View函數沒有返回一個Object。它返回None而不是** 我在帖子本身中鏈接了我的視圖函數,任何想法爲什麼會發生這種情況? –

+0

你應該檢查'request.method ==「POST」' –

+0

也,我建議使用帶調試器的IDE。它可以幫助您查明問題,從而幫助您解決問題。 :) –

相關問題