使用Tastypie Django的Ajax身份验证

使用Tastypie Django的Ajax身份验证,ajax,django,tastypie,django-authentication,Ajax,Django,Tastypie,Django Authentication,我随后创建了我的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

我随后创建了我的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>
#Ajax_Views.py
从django.contrib.auth.models导入用户
从django.contrib.auth导入身份验证、登录、注销
从django.http导入HttpRequest
从django.conf.url导入url
从django.utils导入simplejson
从tastypie.http导入HttpUnauthorized、HttpForbidden
从tastypie.utils导入尾部斜杠
从tastypie.resources导入ModelResource
从tastype.authorization导入授权
类UserResource(ModelResource):
类元:
queryset=User.objects.all()
字段=['名字','姓氏','电子邮件']
允许的_方法=['get','post']
资源名称='user'
授权=授权()
def prepend_URL(自身):
返回[
url(r“^(?P%s)/登录名%s$”%
(self.\u meta.resource\u name,尾随的\u斜杠()),
self.wrap_视图('login'),name=“api_login”),
url(r'^(?P%s)/注销%s$'%
(self.\u meta.resource\u name,尾随的\u斜杠()),
self.wrap_视图('logout'),name='api_logout'),
]
def登录(自我、请求、**kwargs):
self.method_check(请求,允许=['post','ajax'])
data=self.deserialize(request,request.body,format=request.META.get('CONTENT\u TYPE','application/json'))
username=data.get('username','')
password=data.get('password','')
用户=验证(用户名=用户名,密码=密码)
如果用户:
如果user.u处于活动状态:
登录(请求、用户)
返回self.create_响应(请求{
“成功”:真的吗
})
其他:
返回self.create_响应(请求{
“成功”:错误,
'原因':'已禁用',
},http(禁止)
其他:
返回self.create_响应(请求{
“成功”:错误,
'原因':'不正确',
},http(未经授权)
def注销(自我、请求、**kwargs):
self.method_check(请求,允许=['get']))
如果request.user和request.user.经过身份验证():
注销(请求)
返回self.create_响应(请求,{'success':True})
其他:
返回self.create_响应(请求,{'success':False},HttpUnauthorized)
#Jquery/Ajax
$(“#发送”)。单击(函数(e){
e、 预防默认值();
数据={
“用户名”:$('#username').val(),
“密码”:$('#password').val()
};
$.ajax({
类型:“POST”,
url:“http://127.0.0.1:8000/api/user/login/",
数据:JSON.stringify(数据),
数据类型:“json”,
contentType:“应用程序/json”,
成功:函数(数据){console.log(数据)},
错误:函数(rs,e){console.debug(rs)}
});
});
#HTML
发送

我正在尝试为Django 1.5应用程序构建主干网前端

我理解Tastype的内容,并且能够让它正常工作,但是我不确定页面如何知道用户在第一次访问页面时是否登录。我正在使用会话存储-这与JavaScript前端不兼容吗?我是否需要手动存储CSRF令牌并在用户登录后将其删除,我是否被迫使用Django(非Ajax)进行登录/注销,然后重定向到一个带有JavaScript应用程序代码的受保护的Django服务页面

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