2015-10-10 7 views
1

Я использую классные представления.Django CSRF Verifcation failed - Class based views

class UserCreate(View): 
    def post(self, request): 
     data = request.data.get 
     social_id = data('social_id') 
     social_source = data('social_source') 
     user = User(social_id=social_id, social_source=social_source, access_token=access_token) 
     user.save() 
     return JsonResponse({'response':200}) 

Всякий раз, когда я отправляю данные по этому URL, он говорит CSRF token missing or incorrect.

curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{ 
    \"social_id\": \"string\", 
    \"social_source\": \"FB/Gmail\", 
    \"access_token\": \"string\" 
}" "http://127.0.0.1:8000/users/" 

Я имел эту проблему при получении данных из формы в представлениях функций. Там я добавил @csrf_exempt на мой взгляд, и это сработает. Когда я добавил @csrf_exempt к моему методу post, он не работает. Как я могу опубликовать данные?

+0

Для более информация об украшении классов, вот ссылка на соответствующие документы django: https://docs.djangoproject.com /en/1.11/topics/class-based-views/intro/#decorating-the-class – Pitt

ответ

4

Это потому, что является class_based видом вы должны decorate в dispatch method для csrf_exempt работать

class UserCreate(View): 
    @method_decorator(csrf_exempt) 
    def dispatch(self, request, *args, **kwargs): 
    return super(UserCreate, self).dispatch(request, *args, **kwargs) 

    def post(): 
    .... 
+0

Thanx. Это действительно помогло мне. –

3

@csrf_exempt является декоратором для функций, а не классами. Для того, чтобы получить CSRF Освобожденный на ОЦК установить django-braces и импорта CsrfExemptMixin следующим образом:

from braces.views import CsrfExemptMixin

и реализовать это следующим образом:

class UserCreate(CsrfExemptMixin, View): 
    def post(self, request): 
     data = request.data.get 
     social_id = data('social_id') 
     social_source = data('social_source') 
     user = User(social_id=social_id, social_source=social_source, access_token=access_token) 
     user.save() 
     return JsonResponse({'response':200}) 
+0

Я пробовал это, но это не работает для меня. –

3

Вы можете просто создать вид сюда м ОЦК и обернуть его декоратор, как это:

user_view = csrf_exempt(UserCreate.as_view())

Полный пример:

views.py

class UserCreate(View): 
    def post(self, request): 
     data = request.data.get 
     social_id = data('social_id') 
     social_source = data('social_source') 
     user = User(social_id=social_id, social_source=social_source, access_token=access_token) 
     user.save() 
     return JsonResponse({'response':200}) 

user_create = csrf_exempt(UserCreate.as_view()) 

urls.py

from myapp.views import user_create 

urlpatternts = [ 
    ... 
    url(r'^pattern-here/$', user_create, name='user-create'), 
    ... 
] 
+0

Где я могу это поставить? – PythonEnthusiast

+0

Я добавил полный пример. –

Смежные вопросы