2016-08-24 11 views
3

Я использовал window.CSRF_TOKEN = "{{csrf_token}}" внутри тега скрипта в файле restaurant_detail.html, где отображается моя страница с отзывами для публикации. Я получаю сообщение об ошибке. В моей функции onSubmit я утешился, чтобы проверить, прошел ли токен csrf или нет, и да, это так.подробнее: «CSRF Failed: токен CSRF отсутствует или неверен».

мой Вардар код для размещения отзыв является

onSubmit(props){ 
     console.log('csrf',CSRF_TOKEN); 
     axios({ 
      method:'POST', 
      url:'/api/review/create/', 
      headers:{ 
       'X-CSRF-Token':CSRF_TOKEN, 
       //'Access-Control-Allow-Origin':'*', 
       'Accept': 'application/json', 
       'Content-Type': 'application/json', 
      }, 
      data:{ 
       review:props.review 
      } 
     }) 
     .then(response => { 
      console.log('success'); 
     }) 
     .catch(error => { 
      throw("Error: ",error); 
     }); 
    } 

апи/Views.py

class ReviewCreateAPIView(CreateAPIView): 
    queryset = Review.objects.all() 
    # permisssion_classes = [IsAuthenticated] 

    def get_serializer_class(self): 
     model_type = self.request.GET.get('type') 
     slug = self.request.GET.get('slug') 
     parent_id = self.request.GET.get('parent_id') 
     return create_review_serializer(model_type=model_type, slug=slug, parent_id=parent_id, reviewer=self.request.user) 

serializers.py

def create_review_serializer(model_type='restaurant',slug=None, parent_id=None, reviewer=None): 
    class ReviewCreateSerializer(ModelSerializer): 
     class Meta: 
      model = Review 
      fields = ('id','review','created',) 

     def __init__(self, *args, **kwargs): 
      self.model_type = model_type 
      self.slug = slug 
      self.parent_obj = None 
      if parent_id: 
       parent_qs = Review.objects.filter(id=parent_id) 
       if parent_qs.exists() and parent_qs.count() == 1: 
        self.parent_obj = parent_qs.first() 
      return super(ReviewCreateSerializer, self).__init__(*args, **kwargs) 

     def validate(self, data): 
      model_type = self.model_type 
      model_qs = ContentType.objects.filter(model=model_type) 
      if not model_qs.exists() or model_qs.count() != 1: 
       raise ValidationError('This is not a valid content type') 
      SomeModel = model_qs.first().model_class() 
      obj_qs = SomeModel.objects.filter(slug=self.slug) # Restaurant.objects.filter(slug=self.slug) 
      if not obj_qs.exists() or obj_qs.count() != 1: 
       raise ValidationError('This is not a slug for this content type') 
      return data 

     def create(self, validated_data): 
      review = validated_data.get('review') 
      print('review',review) 
      if reviewer: 
       main_reviewer = reviewer 
      else: 
       main_reviewer = User.objects.all().first() 
      model_type = self.model_type 
      slug = self.slug 
      parent_obj = self.parent_obj 
      review = Review.objects.create_for_model_type(model_type, slug, review, main_reviewer, parent_obj=parent_obj) 
      return review 

    return ReviewCreateSerializer 

urls.p у

restaurant_detail.html

<div id="app"></div> 
<script type="text/javascript"> window.CSRF_TOKEN = "{{ csrf_token }}"; </script> 

Как я могу решить эту проблему?

ответ

1

Вы сделали простую ошибку. Опечатка. Как заменить

'X-CSRFToken'

к

'X-CSRFToken'

, если у вас есть код правильно, то он должен опубликовать ваш данные.

+0

О да! Это действительно решило проблему. Спасибо за ответ. – pythonBeginner

0

Я не знаком с Аксиос, но я решил подобную проблему использовать код удара с JQuery:

$.ajaxSetup({ 
    data : { 
     csrfmiddlewaretoken : '{{ csrf_token }}' 
    }, 
}); 
0

вы должны установить заголовок в Ajax вызова со значениями куки.

$.ajaxSetup({ 
beforeSend: function(xhr, settings) { 
    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; 
    } 
    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
     // Only send the token to relative URLs i.e. locally. 
     xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
    } 
} 
}); 
+0

Но я использую аксиомы. Должен ли я делать то же самое для аксиомов? – pythonBeginner

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