使用Tastypie Django进行Ajax身份验证

时间:2013-07-12 17:10:44

标签: ajax django tastypie django-authentication

我跟着this创建了我的ajax身份验证。 ajax不发送POST数据;它发送一个空的querydict。如果我在我的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>

1 个答案:

答案 0 :(得分:0)

我正在尝试在Backbone中为Django 1.5应用程序构建一个前端。

我理解Tastypie的东西,并且已经能够实现这一点,但我不确定页面在首次访问页面时是否知道用户是否登录。我正在使用会话存储 - 这与JavaScript前端不兼容吗?我是否需要手动存储CSRF令牌并在用户登录后将其删除,我是否被迫使用Django(非Ajax)进行登录/注销,然后使用JavaScript应用程序代码重定向到受保护的django服务页面?

我现在正在从django提供JavaScript,以获取CSRF令牌。所以我认为我正走在正确的道路上。