2014-02-19 31 views
5

我目前正在与REST和Backbone.js的玩弄,跑进这个问题:Django的:类视缺乏属性COOKIES

'LoginView' object has no attribute 'COOKIES' 

这里说到下面的代码可能造成的问题。我已经在javascript中注释了一些东西,因为我希望它直接加载到服务器上,但我认为它将同样好。

我还可以补充一点,我检查了表单中的csrf-token并且它在那里。

views.py

class LoginView(TemplateView): 
    authentication_form=LoginForm 
    form_class = LoginForm 
    redirect_field_name=REDIRECT_FIELD_NAME 
    template_name = 'front/login.html' 
    initial = {'key': 'value'} 

    def get(self, request, *args, **kwargs): 
     form = self.form_class(initial=self.initial) 
     return render(request, self.template_name, {'form': form}) 

    @method_decorator(sensitive_post_parameters()) 
    @csrf_protect 
    @never_cache 
    @api_view(['GET', 'POST']) 
    def post(self, request, *args, **kwargs): 
     form = self.form_class(request.POST) 
     print request.COOKIES('csrftoken') 
     print request.POST.get('csrfmiddlewaretoken') 
     if form.is_valid(): 
      #if not is_safe_url(url=redirect_to, host=request.get_host()): 
      # redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL) 
      print request.POST.get('email') 
      #user = self.get_user(request.POST.get('email')) 
      #print user 
      #auth = UserDataAuthentication(request, user) 
      user = authenticate(email=request.POST.get('email'), password=request.POST.get('password')) 
      if user is not None: 
       auth_login(request, user) 
       return Response(user, status=status.HTTP_201_CREATED) 
     return HttpResponseRedirect('/login/') 

login.js

var csrftoken = $('meta[name="csrf-token"]').attr('content'); 
SigninView = Backbone.View.extend({ 
    events: { 
     //"click button[type=submit]": "sendRequest" 
    }, 
    sendRequest: function(event){ 
     //event.preventDefault(); 
     var csrftoken = $.cookie('csrftoken'); 
     var url = '/login/validate/'; 
     var email = $("#id_email").val(); 
     var password = $("#id_password").val(); 
     var items = { 
         email: email, 
         password: password, 
         csrfmiddlewaretoken: csrftoken 
        };  
     console.log(csrftoken); 
     $.ajax({ 
      url:url, 
      type:'POST', 
      dataType:"json", 
      data: items, 
      success: function (data) { 
       var json = $.parseJSON(data); 
       console.log(data); 
      }, 
      error: function (xhr, textStatus, error) { 
       $("#form_error").css('padding','7px').css('border-radius','4px').html('Error recieved: ' + error).fadeIn(); 
       console.log("Status: "+textStatus); 
       console.log("Type: "+error); 
      } 
     }); 
    } 
}); 
var signin_view = new SigninView({ 
    el: $("#login_form") 
}); 

我们两个人这方面的工作,我已在自己与Python工作,而我的朋友采取JS的护理-部分。我还没有经历足够的Django来实际发现可能由于cookie而导致错误的原因。如果可以的话,我会尝试在大多数情况下远离cookie,但这似乎很困难。

,当然还有:回溯:

Traceback: 
File "/home/ryuu/Programming/Python/tabr/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    114.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/home/ryuu/Programming/Python/tabr/venv/local/lib/python2.7/site-packages/django/views/generic/base.py" in view 
    69.    return self.dispatch(request, *args, **kwargs) 
File "/home/ryuu/Programming/Python/tabr/venv/local/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch 
    87.   return handler(request, *args, **kwargs) 
File "/home/ryuu/Programming/Python/tabr/venv/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper 
    29.    return bound_func(*args, **kwargs) 
File "/home/ryuu/Programming/Python/tabr/venv/local/lib/python2.7/site-packages/django/views/decorators/debug.py" in sensitive_post_parameters_wrapper 
    75.    return view(request, *args, **kwargs) 
File "/home/ryuu/Programming/Python/tabr/venv/local/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func 
    25.     return func(self, *args2, **kwargs2) 
File "/home/ryuu/Programming/Python/tabr/venv/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view 
    95.      result = middleware.process_view(request, view_func, args, kwargs) 
File "/home/ryuu/Programming/Python/tabr/venv/local/lib/python2.7/site-packages/django/middleware/csrf.py" in process_view 
    111.     request.COOKIES[settings.CSRF_COOKIE_NAME]) 

Exception Type: AttributeError at /login/validate/ 
Exception Value: 'LoginView' object has no attribute 'COOKIES' 
+0

正如Thomas所回答的那样,您不能装饰方法,请检查django-braces以了解如何在基于类的视图中实现类似的行为。 – petkostas

+0

会做!最近碰到装饰者,所以有一些有趣的东西来读。 –

回答

10

您使用的一个方法的功能装饰。

这不起作用:装饰器返回的函数期望其第一个参数是request,并且接收self

用途:

method_decorator(csrf_protect) 
# and so on 

检查the documentation了解更多详情。

+0

谢谢,它工作得很好,文档将派上用场。 –

+3

method_decorator的相关导入是from from django.utils.decorators import method_decorator' – EdgeCaseBerg

+0

链接被破坏 – pkout