Django: login_required when calling ajax

I am trying to authenticate a user to ajax post but it does not work. Here is what i did

settings.py

LOGIN_URL = '/accounts/login/' LOGIN_REDIRECT_URL = '/' 

Template

 <script> $('.btn-request').click(function(){ var button = this; $.ajax({ type: "POST", url: "{% url 'like' %}", data: {'tutorial_id': $(this).attr('name'), 'csrfmiddlewaretoken': '{{csrf_token}}'}, dataType: "json", success: function(json) { toastr.success(json.message); }, error: function(rs, e) { alert(rs.responseText); } }); }) </script> 

urls.py

 url(r'^like/$', 'apps.quotation.views.like', name='like'), 

views.py - try 1

 @login_required def like(request): vars = {} if request.method == 'POST': response_dict = {} if not something: response_dict.update({'message': "Requested" }) else: response_dict.update({'message': "You have already requested" }) return HttpResponse(simplejson.dumps(response_dict), mimetype='application/javascript') 

views.py - try 2

 def like(request): if not request.user.is_authenticated(): return HttpResponseRedirect('/accounts/login') else: vars = {} if request.method == 'POST': response_dict = {} if not something: response_dict.update({'message': "Requested" }) else: response_dict.update({'message': "You have already requested" }) return HttpResponse(simplejson.dumps(response_dict), mimetype='application/javascript') 

Runserver Magazine

 [05/Mar/2014 05:19:16] "POST /like/ HTTP/1.1" 302 0 [05/Mar/2014 05:19:16] "GET /accounts/login/?next=/like/ HTTP/1.1" 200 5610 

What am I missing?

+7
ajax django login-required
source share
3 answers

Instead:

 if not request.user.is_authenticated(): return HttpResponseRedirect('/accounts/login') 

return json response:

 if request.user.is_authenticated(): ## write your code... jsonr = json.dumps({ 'authenticated': True }) return HttpResponse(jsonr, mimetype='application/json') else: jsonr = json.dumps({ 'authenticated': False }) return HttpResponse(jsonr, mimetype='application/json') 

And When responding to the success of ajax, if it is not authenticated, redirect it using windows.location .

OR you can write a decorator: Django and Ajax authentication - URLs requiring login

+5
source share

When I want to verify that when an Ajax call, the user is logged in, this is what I use:

 from functools import wraps from django.core.exceptions import PermissionDenied def ajax_login_required(view): @wraps(view) def wrapper(request, *args, **kwargs): if not request.user.is_authenticated(): raise PermissionDenied return view(request, *args, **kwargs) return wrapper 

raise PermissionDenied will return a 403 status code to the client. Otherwise, if you use the @login_required decorator or manually redirect the form, what the Ajax call sees as the answer is what makes sense to the person, but not what makes sense to call Ajax.

+9
source share

I'm not sure if this was an elegant solution, but I made it work as suggested by Priyank Patel

 <script> $('.btn-request').click(function(){ var button = this; $.ajax({ type: "POST", url: "{% url 'like' %}", data: {'tutorial_id': $(this).attr('name'), 'csrfmiddlewaretoken': '{{csrf_token}}'}, dataType: "json", success: function(json) { if(json.not_authenticated) { window.location.replace("/accounts/login"); } else { toastr.success(json.message); } }, error: function(rs, e) { alert(rs.responseText); } }); }) </script> 

views.py

 def like(request): response_dict = {} if request.user.is_authenticated(): if request.method == 'POST': if not something: response_dict.update({'message': "Requested" }) else: response_dict.update({'message': "You have already requested" }) return HttpResponse(simplejson.dumps(response_dict), mimetype='application/javascript') else: response_dict.update({'message': "Login please",'not_authenticated':True }) return HttpResponse(simplejson.dumps(response_dict), mimetype='application/javascript') 
-one
source share

All Articles