2016-10-04 15 views
0

私は特にWebプログラミングとdjangoにはかなり新しいです。私はAjaxを使用してシンプルなログインサービスを実装しようとしています。ユーザーが正常にログインしているように見えますが、ビューが変更されると再びuloggedされます。Djangoはビューの間にユーザーをログインさせていません

ありがとうございました。おかげさまで

ログインテンプレート:

<form class="login-form" action=""> 
    {% csrf_token %} 
    <input type="text" id="usernamelog" /> 
    <input type="password" id="pwdlogin" /> 
    <button onclick="login(event)">login</button> 
    <p class="message">Not registered? <a href="#">Create an account</a></p> 
</form> 

ログインアヤックス:

function login(e) { 
     e.preventDefault(); 
     var username = $("#usernamelog").val(); 
     var pwd = $("#pwdlogin").val(); 
     $.ajaxSetup({ 
      beforeSend: function(xhr, settings) { 
       if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
        // Only send the token to relative URLs i.e. locally. 
        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
       } 
      } 
     }); 
     $.ajax({ 
      url : "/loginscript/", 
      type : "post", 
      data : { 
       username: username, 
       password : pwd, 
      } 
     }).done(function(data) { 
      if (data == "good") { 
       document.getElementById('usernamelog').value ="good"; 
       window.location='../ehealth' 
      }else{ 
       document.getElementById('usernamelog').value ="bad"; 
      } 
     }); 
    } 


    function getCookie(name) { 
     var cookieValue = null; 
     if (document.cookie && document.cookie != '') { 
      var cookies = document.cookie.split(';'); 
      for (var i = 0; i < cookies.length; i++) { 
       var cookie = jQuery.trim(cookies[i]); 
       // Does this cookie string begin with the name we want? 
       if (cookie.substring(0, name.length + 1) == (name + '=')) { 
        cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
        break; 
       } 
      } 
     } 
     return cookieValue; 
    } 

Loginscriptビュー:

def loginscript(request): 
#c = {} 
#c.update(csrf(request)) 
print >> sys.stderr,"script entered" 
username = request.POST['username'] 
password = request.POST['password'] 
print >> sys.stderr, username 
user = authenticate(username=username, password=password) 
if user is not None: 
    login(request=request,user=user) 
    if User.is_authenticated: 
     print >> sys.stderr,"should be good actually" 
    else: 
     print >> sys.stderr, "Still not" 
    return HttpResponse("good") 

else: 
    print >> sys.stderr,"Should be bad" 
    return HttpResponse("bad") 

eHealthのビュー:

def index(request): 
check=User.is_authenticated 
if check!=True: 
    return redirect('http://127.0.0.1:8000/login/') 

template="index.html" 
return render (request=request, template_name=template) 

私が手ログ:

Hey we are in login 
[04/Oct/2016 14:02:42] "GET /login/ HTTP/1.1" 200 6881 
script entered 
Andrey 
should be good actually 
[04/Oct/2016 14:02:46] "POST /loginscript/ HTTP/1.1" 200 4 
[04/Oct/2016 14:02:46] "GET /ehealth/ HTTP/1.1" 302 0 
Hey we are in login 

だから、ユーザーがログインしてから、このコードスニペットログに記録されない

答えて

2

User.is_authenticatedは常にtrueですあなたがクラスでそれを呼んでいるからです。実際のユーザーインスタンスのメソッドを確認する必要があります。ログインビューでuserですが、インデックスビューではrequest.userになります。

ただし、インデックスビューで認証を確認するさらに簡単な方法は、login_required decoratorを使用することです。

+0

ああ、ありがとうございます! – asakryukin

2

使ってログインページに戻ってリダイレクトされます。

def index(request):   
     if not request.user.is_authenticated(): 
     return redirect('http://127.0.0.1:8000/login/') 

     template="index.html" 
     return render (request=request, template_name=template) 
1

コードにはかなりの問題があります。ユーザクラス(User資本U)からではなく、あなたがログインしようとしているユーザーインスタンスから

  1. あなたは(私はそれに取得します、ノー呼び出していない)呼んでいるis_authenticatedすなわちuser.is_authenticated

  2. is_authenticatedの属性は、Django < 1.10のバージョンのメソッドです。 1.10未満のバージョンの場合は、二重括弧を使用してメソッドを呼び出す必要があります。

関連する問題