2013-07-12 3 views
1

나는 나의 ajax 인증을 만들기 위해 this을 따라 갔다. 아약스는 POST 데이터를 보내지 않습니다. 빈 querydict을 보냅니다. 내 아약스보기에서 내 사용자 이름과 암호를 명시 적으로 작성하면 로그인과 로그 아웃이 완벽하지만 ... 쓸모가 없습니다.Tastypie Django로 Ajax 인증

답변을 찾았습니다. Django 1.5.1에서 업데이트되었습니다. 아래 코드가 작동합니다.

#Ajax_Views.py 
from django.contrib.auth.models import User 
from django.contrib.auth import authenticate, login, logout 
from django.http import HttpRequest 
from django.conf.urls import url 
from django.utils import simplejson 

from tastypie.http import HttpUnauthorized, HttpForbidden 
from tastypie.utils import trailing_slash 
from tastypie.resources import ModelResource 
from tastypie.authorization import Authorization 

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     fields = ['first_name', 'last_name', 'email'] 
     allowed_methods = ['get', 'post'] 
     resource_name = 'user' 
     authorization = Authorization() 

    def prepend_urls(self): 
     return [ 
     url(r"^(?P<resource_name>%s)/login%s$" % 
      (self._meta.resource_name, trailing_slash()), 
      self.wrap_view('login'), name="api_login"), 
     url(r'^(?P<resource_name>%s)/logout%s$' % 
      (self._meta.resource_name, trailing_slash()), 
      self.wrap_view('logout'), name='api_logout'), 
     ] 

    def login(self, request, **kwargs): 
     self.method_check(request, allowed=['post', 'ajax']) 

     data = self.deserialize(request, request.body, format=request.META.get('CONTENT_TYPE', 'application/json')) 
     username = data.get('username', '') 
     password = data.get('password', '') 
     user = authenticate(username=username, password=password) 
     if user: 
      if user.is_active: 
       login(request, user) 
       return self.create_response(request, { 
        'success': True 
       }) 
      else: 
       return self.create_response(request, { 
        'success': False, 
        'reason': 'disabled', 
        }, HttpForbidden) 
     else: 
      return self.create_response(request, { 
       'success': False, 
       'reason': 'incorrect', 
       }, HttpUnauthorized) 


    def logout(self, request, **kwargs): 
     self.method_check(request, allowed=['get']) 
     if request.user and request.user.is_authenticated(): 
      logout(request) 
      return self.create_response(request, { 'success': True }) 
     else: 
      return self.create_response(request, { 'success': False }, HttpUnauthorized) 



#Jquery/Ajax 

$('#send').click(function(e){ 
    e.preventDefault(); 
    data = { 
     "username": $('#username').val(), 
     "password": $('#password').val() 
    }; 
    $.ajax({ 
     type: "POST", 
     url: "http://127.0.0.1:8000/api/user/login/", 
     data: JSON.stringify(data), 
     dataType: "json", 
     contentType: "application/json", 
     success: function(data) {console.log(data)}, 
     error: function (rs, e) {console.debug(rs)} 
    }); 
}); 

#The HTML 

    <input type='text' id='username' /> 
    <input type='password' id='password'/> 
    <input type='submit' id='send' class='btn' href='#'>Send</a> 

답변

0

Django 1.5 앱의 백본에서 프런트 엔드를 구축하려고합니다.

Tastypie 항목을 이해하고 그 기능을 사용할 수는 있지만 페이지를 처음 방문했을 때 사용자가 로그인했는지 여부는 페이지에서 알 수 없습니다. 세션 저장 공간을 사용하고 있습니다. 자바 스크립트 프런트 엔드와 호환되지 않습니까? 사용자가 로그인 한 후에 수동으로 CSRF 토큰을 저장하고 삭제해야합니까? 로그인/로그 아웃을 위해 Django (Ajax가 아닌)를 사용하고 자바 스크립트 앱 코드가있는 보호 된 django 서비스 페이지로 리디렉션해야합니까?

CSRF 토큰을 얻기 위해 지금 django의 JavaScript를 제공하고 있습니다. 그래서 나는 올바른 방향으로 가고 있다고 생각합니다.