Make login view accept json instead of form encoded data.

remotes/origin/enhancement/email-actions
Andrey Antukh 2013-03-26 00:17:55 +01:00
parent 67ac0dd001
commit 2c67e002ff
2 changed files with 48 additions and 17 deletions

View File

@ -1,31 +1,63 @@
# -*- coding: utf-8 -*-
import datetime
import json
from django.core.serializers.json import DjangoJSONEncoder
from django.views.generic.base import View from django.views.generic.base import View
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.http import HttpResponse
from django.contrib.auth import logout, login, authenticate from django.contrib.auth import logout, login, authenticate
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils.functional import Promise
from django.utils.encoding import force_text
from django.utils.decorators import method_decorator
from django.utils import timezone
from django import http
import json
class LazyEncoder(DjangoJSONEncoder):
"""
JSON encoder class for encode correctly traduction strings.
Is for ajax response encode.
"""
def default(self, obj):
if isinstance(obj, Promise):
return force_text(obj)
elif isinstance(obj, datetime.datetime):
obj = timezone.localtime(obj)
return super(LazyEncoder, self).default(obj)
def request_json_to_dict(request):
try:
body = request.body.decode('utf-8')
return json.loads(body)
except Exception:
return {}
def to_json(data):
return json.dumps(data)
class Login(View): class Login(View):
def post(self, request): def post(self, request):
username = request.POST.get('username', None) data = request_json_to_dict(request)
password = request.POST.get('password', None)
print username username = data.get('username', None)
print password password = data.get('password', None)
try: try:
user = User.objects.get(username=username) user = User.objects.get(username=username)
if user.check_password(password): if user.check_password(password):
user = authenticate(username=username, password=password) user = authenticate(username=username, password=password)
login(request, user) login(request, user)
return HttpResponse(json.dumps({'token': request.session.session_key, 'error': False})) return http.HttpResponse(to_json({'token': request.session.session_key}))
except User.DoesNotExist: except User.DoesNotExist:
pass pass
return HttpResponse(json.dumps({'error': True})) return http.HttpResponseBadRequest()
@method_decorator(csrf_exempt) @method_decorator(csrf_exempt)
def dispatch(self, *args, **kwargs): def dispatch(self, *args, **kwargs):

View File

@ -3,15 +3,14 @@ from django.conf.urls import patterns, include, url
from django.contrib import admin from django.contrib import admin
admin.autodiscover() admin.autodiscover()
from base.api_actions import Login, Logout
from tastypie.api import Api from tastypie.api import Api
from scrum.api import * from .base.api_actions import Login, Logout
from questions.api import * from .scrum.api import *
from documents.api import * from .questions.api import *
from profile.api import * from .documents.api import *
from wiki.api import * from .profile.api import *
from .wiki.api import *
v1_api = Api(api_name='gm') v1_api = Api(api_name='gm')
v1_api.register(ProjectResource()) v1_api.register(ProjectResource())