2011-07-05 5 views
0

이 문제는 다른 문제와 다르다고 생각합니다. 답변을 확인한 결과 행운을 빕니다. 어떤 도움을 주셔서 감사합니다 :Django의 의견 - Ajax 및 CSRF 오류

뉴스 항목 목록 (예 : 페이스 북 피드)과 각 주석 형식 (django.contrib.comments 응용 프로그램 사용)이 첨부되어 있습니다. 정상적으로 잘 작동합니다.

하지만 페이지에서 AJAX '무한 스크롤'을 사용하고 있습니다. 스크롤하면 AJAX를 통해 다음 뉴스 세트 및 관련 코멘트 양식이로드됩니다. 새로로드 된 뉴스 항목에 대한 의견 양식이 작동하지 않습니다 (CSRF 검증에 실패 함).

{% csrf_token %}이 (가) 되돌아 오는 JSON 응답에 전달되지 않는 이유는 분명합니다. 따라서 새로로드 된 주석 양식에는 CSRF 데이터가 없습니다.

Django 페이지 (https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#ajax)에서 쿠키 설정 방법을 사용해 보았지만 제대로 작동하지 않습니다. CSRF를 완전히 제외 시키려고 @csrf_exempt 데코레이터를 시도하지도 않습니다.

반환하는 JSON 응답과 함께 csrf_token을 전달할 수있는 방법에 대한 제안 사항이 있으십니까? 아니면 대안이 있습니까?

다음은 뷰의 :

def my_view(request): 
    # the normal view gets a queryset of all Info items and returns them 
    infos = Info.objects.all() 
    .... 

    # here's the AJAX part 
    if request.GET.get('xhr') and page > 1: 
     infos = paginator.page(int(request.GET.get('page'))) 
     objects_list = [] 
     for object in infos: 
      objects_list.append(render_to_string('list/snippets/feed_li.html', { 
       'object': object, 
      })) 

     json = simplejson.dumps(objects_list, cls=DjangoJSONEncoder) 
     return HttpResponse(json, mimetype='application/json') 

답변

0

하나의 옵션을 사용하면 반환하는 JSON 응답을 통해 형태로 CSRF 토큰을 제공하는 것입니다. django.middleware.csrf.get_token(request)을 호출하고 아약스 응답에 해당 값을 포함시켜 CSRF 토큰을 프로그래밍 방식으로 얻을 수 있다고 생각합니다.

내가 생각할 수있는 다른 옵션은 해당보기에 대해 CSRF 보호를 비활성화하는 것입니다.

0

먼저 'list/snippets/feed_li.html'에 {% csrf_token %}을 (를) 포함하는 것을 잊었는지 확인하십시오.

둘째, csrf 토큰이 제대로 작동하려면 템플릿을 렌더링 할 때 RequestContext를 사용하거나 수동으로 토큰을 생성하고 컨텍스트 변수에 추가해야합니다 (Django csrf ref 참조).

objects_list.append(render_to_string('list/snippets/feed_li.html', { 
    'object': object, 
})) 

과 :

''' from django.template import RequestContext ''' 
objects_list.append(render_to_string('list/snippets/feed_li.html', \ 
    RequestContext(request, {'object':object}) 
)) 

나 :

''' from django.core.context_processors import csrf ''' 
vars = {} 
vars.update(csrf(request)) 
vars.update({'object':object}) 
objects_list.append(render_to_string('list/snippets/feed_li.html', vars)) 
따라서, 라인을 교체