2016-03-12 7 views
1

Теперь я расскажу о регистрации пользователя. Я уже разрешаю разрешение на этот запрос. Но, когда я отправляю сообщение от почтальона, я получилDjango Регистрация пользователя и токен CSRF

"detail": "CSRF Failed: CSRF token missing or incorrect." 

Как мне сделать?

class RegistrationView(APIView): 
    """ Allow registration of new users. """ 
    permission_classes = (permissions.AllowAny,) 

    def post(self, request): 
     serializer = RegistrationSerializer(data=request.DATA) 

     # Check format and unique constraint 
     if not serializer.is_valid(): 
      return Response(serializer.errors,\ 
         status=status.HTTP_400_BAD_REQUEST) 
     data = serializer.data 

    # u = User.objects.create_user(username=data['username'], 
    #        email=data['email'], 
    #        password='password') 

    u = User.objects.create(username=data['username']) 
    u.set_password(data['password']) 
    u.save() 

    # Create OAuth2 client 
    name = u.username 
    client = Client(user=u, name=name, url='' + name,\ 
      client_id=name, client_secret='', client_type=1) 
    client.save() 
    return Response(serializer.data, status=status.HTTP_201_CREATED) 
+0

Возможный дубликат [Django Rest Framework remove csrf] (http://stackoverflow.com/questions/30871033/django-rest-framework-remove-csrf) – Ali

+0

@Ali Спасибо. Мне все еще нужен csrf. Но я хочу отключиться для регистрации. –

ответ

-1

Поскольку вы используете аутентификацию сеанса, обычно требуется проверка CSRF. Поэтому вы должны передать токен CSRF в заголовок X-CSRFToken.

Поскольку вы фактически не вошли в систему, вы должны использовать декоратор csrf_exempt.

from django.views.decorators.csrf import csrf_exempt 

class RegistrationView(APIView): 
    permission_classes = (permissions.AllowAny,) 

    @csrf_exempt 
    def post(self, request): 
     # Do what needs to be done 
     pass 
+0

Я все еще получил эту ошибку. –

1

CSRF не имеют ничего общего с permission classes. APIView по умолчанию csrf-exempt. Очень хорошее обсуждение APIView и csrfhere

Поскольку APIViews может быть использовано как из браузера (который нуждается в защите от CSRF) или сервер (который не нуждается в защите от CSRF) по умолчанию защита CSRF выключена. Однако по умолчанию APIView имеет класс аутентификации SessionAuthentication. Этот класс будет динамически повторно применять промежуточное ПО CSRF django, если текущий объект запроса содержит активного пользователя.

Так что, скорее всего, вы получаете эту ошибку из-за вас уже logged in.

+0

Я пробовал из почтальона. Я еще не входил в систему. Как мне это сделать? –

+0

@KhantThuLinn Затем вы отправляете неверные данные ... Или если вы хотите полностью отключить '' '' csrf''', отключите классы проверки подлинности ... '' 'authentication_classes =()' '' в – Satyajeet

0

Вы можете найти более подробную информацию здесь: https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/

Форма:

<form action="." method="post">{% csrf_token %} 

AJAX:

Получить CSRF из печенья:

// using jQuery 
function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie != '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) == (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
} 
var csrftoken = getCookie('csrftoken'); 

JQuery AJAX:

function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 
function sameOrigin(url) { 
    // test that a given url is a same-origin URL 
    // url could be relative or scheme relative or absolute 
    var host = document.location.host; // host + port 
    var protocol = document.location.protocol; 
    var sr_origin = '//' + host; 
    var origin = protocol + sr_origin; 
    // Allow absolute or scheme relative URLs to same origin 
    return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || 
     (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || 
     // or any other URL that isn't scheme relative or absolute i.e relative. 
     !(/^(\/\/|http:|https:).*/.test(url)); 
} 
$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) { 
      // Send the token to same-origin, relative URLs only. 
      // Send the token only if the method warrants CSRF protection 
      // Using the CSRFToken value acquired earlier 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
}); 
Смежные вопросы