Django:ajax调用的login_required

Mys*_*des 10 django ajax login-required

我试图在ajax帖子上验证用户,但不起作用.这就是我所做的

settings.py

LOGIN_URL = '/accounts/login/'
LOGIN_REDIRECT_URL = '/'
Run Code Online (Sandbox Code Playgroud)

模板

<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>
Run Code Online (Sandbox Code Playgroud)

urls.py

url(r'^like/$', 'apps.quotation.views.like', name='like'),
Run Code Online (Sandbox Code Playgroud)

views.py - 尝试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')
Run Code Online (Sandbox Code Playgroud)

views.py - 尝试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')
Run Code Online (Sandbox Code Playgroud)

运行服务器日志

[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
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Lou*_*uis 12

当我想检查当用户登录时进行Ajax调用时,我使用的是:

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
Run Code Online (Sandbox Code Playgroud)

raise PermissionDenied将导致403状态代码返回给客户端.否则,如果您使用@login_required装饰器或手动重定向到表单,那么Ajax调用看作响应的内容对于人类是有意义的,但对于Ajax调用没有意义.

  • 你过早地结束了你的第一个报价。这是相关部分:“服务器请求客户端通过 HTTP 身份验证登录 ** 并已发送回复标头以启动该过程**” 我已将重要部分加粗。看,401 不是您在请求无法完成时发送的响应,因为用户未登录。如果您希望用户使用“HTTP 身份验证”,您只发送它****。并且“HTTP 身份验证”不是一个通用术语,而是一个术语,指的是 HTTP 标头的特定用途。默认情况下,Django 不使用此方法,因此 401 是不合适的。 (3认同)

Pri*_*tel 5

代替 :

if not request.user.is_authenticated():
   return HttpResponseRedirect('/accounts/login')
Run Code Online (Sandbox Code Playgroud)

返回json响应:

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')
Run Code Online (Sandbox Code Playgroud)

在您的ajax成功响应中,如果未经过身份验证,则重定向到使用登录windows.location.

或者您可以编写装饰器: Django身份验证和Ajax - 需要登录的URL