2017-03-21 6 views
0

私はdjangoを初めて使うので、私のindex.html(1st appのテンプレート)ファイルからフォームappをアカウントアプリ(別のアプリ)のビューに送信します。 PY2つの異なるアプリケーション間でリクエストを送信するときにCSRFトークンが見つからないか正しくありません

のindex.html - app01 /テンプレート

<!DOCTYPE html> 
<html> 
<head> 
    <title>hello</title> 

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 


    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> 

<style type="text/css"> 
    body{ 
     background-color: 'lightblue'; 
    } 
</style> 
</head> 

<body> 
<nav class="navbar navbar-inverse bg-faded"> 
<a class="navbar-brand" href="#about"> 
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Cyno_Small_Logo_(Aug._2015).png/240px-Cyno_Small_Logo_(Aug._2015).png" width="30" height="30" > 

</a> 
<div class="col-md-2 bg-warning"><h3>Quizapp</h3></div> 

<div class="container off col-md-offset-2"> 
    <ul class="nav nav-tabs"> 
     <li><a data-toggle="tab" href="#regtab">New User? Register here!</a></li> 
     <li><a data-toggle="tab" href="#logtab">Already have an account? Login!</a></li> 
    </ul> 
</nav> 
    <div class="tab-content"> 
     <div id="regtab" class="tab-pane fade text-primary"> 


    {% csrf_token %} 

     {{ rform }} 



    <button id="rbtn" type="button" class="btn btn-primary btn-lg ">Register!</button> 
     </div> 
     <div id="logtab" class="tab-pane fade text-success" data- loading-text="Registering"> 

    {% csrf_token %} 

     {{ lform.as_p }} 



     <button id="lbtn" type="button" class="btn btn-primary btn-lg   " data-loading-text="Logging in" >Login!</button> 
     </div> 
    </div> 
</div> 




<script type="text/javascript"> 

$('#rbtn').click(function(){ 
    var form_data = { 
     'username' : $('#id_username').val(), 
     'password' : $('#id_password').val(), 
     'name' : $('#id_name').val() 
    } 
    $.post('/register_data/',form_data,function (data, status){ 
     var dt = JSON.parse(data); 
     var reg_status = dt.data.status; 
     if(reg_status == 'success'){ 
      alert("registered! click Ok to go to home"); 
      window.location = '/'; 
     } 
     else{ 
      alert("check form bro!"); 
     } 

    }); 
}); 

</script> 
</body> 

</html> 

views.pyは - 私は、登録ボタンをクリックし

from django.shortcuts import render,redirect  
from django.http import HttpResponse 
from django.views.decorators.csrf import csrf_exempt  
from app01.models import LoginForm,RegisterForm 
from django.contrib.auth import authenticate, login, logout 
from django.contrib.auth.decorators import login_required 
import json 
@csrf_exempt 
def register_data(request): 
    resp = { 
     'status': '' 
    } 

    if not request.method == 'POST': 
     resp['status'] = 'post req pls' 
     return HttpResponse(json.dumps({'data': resp})) 

    frm = RegisterForm(request.POST) 

    if frm.is_valid(): 

     uname = frm.cleaned_data['username'] 
     ps = frm.cleaned_data['password'] 
     name = frm.cleaned_data['name'] 
     try: 
      usr= User(username=uname) 
      usr.set_password(ps) 
      usr.save() 


     except: 
      resps['status']='user already exists' 
      return HttpResponse(json.dumps({'data':resp})) 

     myusr = MyUser(user=usr,name=name) 
     myusr.save() 
     return redirect('/') 
     resp['status'] = 'success' 
     return HttpResponse(json.dumps({'data':resp})) 

毎回アカウント、端末はCSRFトークン見つからないか、インコ、403禁止エラーを返します。起立。私は既にフォームの前に{%csrf_token%}を、そして関数の前に@csrf_exemptを含んでいます。

コードは(ログイン機能はまだ作られている)まだ開発中であり、このレジスタのページでは、フォームタグの中にフォームをレンダリングする必要がviews.py/register_data

答えて

1

にリクエストを送信するまで、私はこだわっています。ドキュメントを参照してください:https://docs.djangoproject.com/en/1.10/topics/forms/#the-template

<form> 
    {% csrf_token %} 
    {{ rform }} 
</form> 
<form> 
    {% csrf_token %} 
    {{ lform.as_p }} 
</form> 
+0

私はそのはまだコンソールでこのエラーを示す、両方のフォームの外にフォームタグを追加しました: jquery.min.js:4 POSTはhttp:// localhostを:8000/register_data/403(禁止します) と端末でこの:禁断(CSRFトークン見つからないか、正しくない。):/ register_data/ [22 /月/ 2017年午後01時42分04秒] "POST/register_data/HTTP/1.1" そのことについて申し訳ありません403 2502 – nimish666

+0

、私はdidnのjQueryを使用してデータをPOSTしていることに気付かないでください。 POSTペイロードにCSRFトークンを 'csrfmiddlewaretoken'という名前で送る必要があります。 –

+0

どこに追加すればいいですか? 私が参照できる資料はありますか? クイック返信ありがとうbtw – nimish666

関連する問題