2010-11-27 2 views
5

이 메시지가 나타납니다 :영구적 인 "CSRF 토큰 누락 또는 부정확". Jinja 및 django 등록 설정

CSRF 토큰이 없거나 잘못되었습니다.

대부분의 포럼에서 {% csrf_token %}을 (를) 얻으라고 말합니다. 그것은에 보이기 때문에, 나는 CSRF를 사용하는 것 같지 않았어요 신사를 사용하고

TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.csrf", 
"django.contrib.auth.context_processors.auth", 
) 

,하지만 난 장고 등록을 설치하고 난 잃었어요 : 또한

난 내 settings.py에있다 다른 관점을 사용하고 있으며, 내가 말할 수있는 권한이 없으며, 저에게 쓴 것이 아니며, 그들이 어디에 있는지 파악할 수 없습니다. "표준 인증보기"를 호출합니다. 그래서 "RequestContext"를 추가 할 수 없습니다.

어떤 아이디어가 진행되고 어떻게 진행될 수 있습니까? 고맙습니다

+0

서식 파일의 모양은 무엇입니까? – JonC

+0

{% 연장 "site_base.html"%} {% 블록 본체 %}

\t {%의 csrf_token의 %} {{form.as_p} } }
{%의 엔드 블록 신체 % <입력 유형 = 값 = "제출"/ "제출">을 – mgPePe

답변

3

장고 등록보기를 수동으로 다시 작성해야 할 수도 있습니다. issue with how Jinja likes to do things and how Django wants to configure template loaders.이있는 것 같습니다.

표준 인증보기를 보려면 파이썬 설치에서 "site-packages"를 살펴보십시오.

당신은이 같은 표준 인증 뷰를 포장 시도 할 수 다음 csrf_protect 장식이

기본적으로 내가 장고의 표준 인증 뷰를 수입하고 내 자신과 그들에게 전화
from django.contrib.auth.views import login, logout 
from django.views.decorators.csrf import csrf_protect 

@csrf_protect 
def my_wrapped_login_view(request): 
    return login(request) 

@csrf_protect 
def my_wrapped_logout_view(request): 
    return logout(request) 

. 그것은 가치가있다.

+0

당신의 대답은 너무 복잡해서 비트별로 조금씩 조사해야 할 것입니다. 그리고 대부분 사용자 정의보기를 설정하는 방법이 있습니다. 고맙습니다. – mgPePe

2

표준 Django 템플릿 시스템도 설치 했습니까? 이는 템플릿과 함께 배포되는 대부분의 앱에 필요합니다.

CSRF의 경우 컨텍스트 프로세서는 미들웨어에서 검색 한 응답 컨텍스트에 변수 'csrf_token'을 삽입합니다. 이제해야 할 일은 그것이 당신의 형식과 다른지 확인하는 것입니다.

이것은 django.core에서 바로 나오며 언제든지 변경 될 수 있습니다.

 if csrf_token: 
      if csrf_token == 'NOTPROVIDED': 
       return mark_safe(u"") 
      else: 
       return mark_safe(u"<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='%s' /></div>" % csrf_token) 

그러나, 당신이 정말 알아야 할 모든 당신이 context.get의 값으로 csrfmiddlewaretoken 이름을 입력 형 양식 내에서 ('', 'csrf_token')을 가져야하고 모든 점이다 것을보고 그녀가 적었다.

+0

동일한 문제가 있습니다. 템플릿의 소스를 볼 때 csrfmiddlewaretoken이라는 입력 유형이 표시되지 않으면 어떻게됩니까? – juankysmith

+0

@juanky, 요점은 템플릿에 포함되어야한다는 것입니다. django는이 목적을 위해'{% csrf_token %}'컨텍스트 프로세서를 제공합니다. 다른 템플릿 언어를 사용하는 경우 템플릿의 각 양식에 위 코드의 html이 포함되어 있는지 확인해야합니다. –

+0

모든 양식 안에 {% csrf_token %}이 (가) 있습니다. 내보기는 요청 대신 RequestContext를 사용하고 TEMPLATE_CONTEXT_PROCESSORS는 settings.py에서 올바르게 정렬됩니다 ... 그러나 여전히이 바보 같은 'CSRF 토큰 누락 또는 부정확'메시지가 나타납니다. – juankysmith

1

이 중 가장 간단한 대답은 template/html의 form 태그 내에 {% csrf_token %}을 넣는 것입니다.

-6

난 그냥과 같이 설정으로 CSRF 미들웨어를 전환, 지금은 작동 : 일반적으로 단지 Jinja2 장고를 사용

#'django.middleware.csrf.CsrfViewMiddleware', 
+2

이제 CSRF 보호가 없다. 이것은 정답으로 표시되어서는 안됩니다 *! – spookylukey

+2

나쁜 것은 나쁜 것 이상으로 나쁜 것입니다! –

2

이 답변 장고 등록을 할 특정 아니라.

django의 CsrfViewMiddleware는 csrf_token 컨텍스트 멤버에 액세스했다고 판단하면 csrf_token 쿠키를 설정합니다. 아쉽게도 Jinja2 렌더링은 Django의 미들웨어가 실행될 때까지 발생하지 않습니다. 결과적으로 쿠키가 설정되지 않으므로 양식과 일치하지 않으므로 403 오류가 발생합니다.

이 문제를 해결하려면 응답 처리를 완료하기 전에 어느 시점에서 컨텍스트 [ 'csrf_token']에 액세스해야합니다. 뷰 클래스에서 다음

class CsrfProtectMixin(object): 
    def render_to_response(self, context, **response_kwargs): 
     # Csrf processing happens when using a RequestContext. 
     # Be sure to use one. 
     if not isinstance(context, RequestContext): 
      context = RequestContext(self.request, context) 

     # Force access to csrf_token due to the way jinja2 renders the template 
     # after middleware has finished processing. Otherwise, the csrf cookie 
     # will not be set. 
     str(context.get('csrf_token')) 

     return super(CsrfProtectMixin, self).render_to_response(context, **response_kwargs) 

: 그리고 당신은 클래스 기반 뷰를 사용하는 경우

, 당신이 CsrfProtectMixin를 만들 수 있습니다

class MyView(CsrfProtectMixin, TemplateView): 
    def get(self, request, *args, **kwargs): 
     context = {} 
     return self.render_to_response(context) 

당신이 사용하지 않는 경우 클래스 기반 클래스의 논리

def my_view(request): 
    context = RequestContext(request) 
    str(context['csrf_token']) #force access to the csrf_token 
    return render_to_response('template.html', context) 

아니면 원숭이 패치 render_to_reponse :보기, 당신은 뭔가를 할 수 있습니다 위.