2014-07-19 2 views
1

Django를 사용하여 사이트를 개발했으며 내 응용 프로그램에 포함 된 모델 중 하나를 기반으로 간단한 양식을 구현하려고합니다. 문제가 발생했지만 현재의 주요 문제는 CSRF 토큰이 누락되었거나 잘못되었습니다. 다음 오류가 계속 발생한다는 것입니다.Django csrf 토큰 누락 또는 잘못된 오류

저는 Python 2.7에서 Django 1.6을 실행하고 있습니다. 전달 기본적으로 -

Django: CSRF token missing or incorrect :

는 이미 (I 적절한에 상황에 맞는 참조를 제공하고 다양한 솔루션) 내 문제를 해결하려고 다음과 같은 글을 통해 보았다, 그러나 그것은 나를 위해 일하지 RequestContext와 함께 render_to_response 반환합니다.

CSRF Token missing or incorrect은 - 나는 django.middleware.csrf.CsrfViewMiddlewaresettings.py 파일에 나타나는 것을 확인했다하고 내가 설정 내 TEMPLATE_CONTEXT_PROCESSORS에 지시하지만, 변화가 없기 때문에 django.core.context_processors.csrf을 추가하는 것을 시도했다.

> from django.conf import settings 
> settings.TEMPLATE_CONTEXT_PROCESSORS 
('django.contrib.auth.context_processors.auth', 
'django.core.context_processors.debug', 'django.core.context_processors.i18n', 
'django.core.context_processors.media', 'django.core.context_processors.static', 
'django.core.context_processors.tz', 
'django.contrib.messages.context_processors.messages') 

내가 내 settings.py 파일에 다음 코드를 배치하지만 난 403 CSRF 토큰 오류가 계속 : I 쉘에서 이러한 설정을 확인할 때, 나는 다음과 같은 출력을 얻을

import django.conf.global_settings as DEFAULT_SETTINGS 

TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.csrf', 
) 

또한 오류 메시지 자체에서 제시 한 제안을 따라했습니다. 즉, Context 대신 RequestContext를 사용하여 {% csrf_token %} 태그를 제 위치에 두었습니다. 내 views.py 파일에서

:

from django.shortcuts import render 
from django.views.decorators.csrf import csrf_protect, csrf_exempt 
from django.template import loader, Context 
from django.http import HttpResponse 
from forms import StudentForm 
from django.http import HttpResponseRedirect 
from django.core.context_processors import csrf 
from django.template import RequestContext 

def edit(request): 
form = StudentForm(request.POST or None) 
if form.is_valid(): 
    form.save() 
    return Redirect('/myprofile/') 
return render(request, 'myprofile.html',{'form':form}) 

제발하지 내가 여러 가지 방법으로 RequestContext을 포함 것을 포함이 문제 해결에 여러 가지 다른 가이드를 읽고 있음 : 나를 위해 일한 어느 것도 return render_to_response('myprofile.html', RequestContext(request, {}))return render_to_response('myprofile.html', RequestContext(request))을, .

내 settings.py 파일 :

import django.conf.global_settings as DEFAULT_SETTINGS 

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'myprofile', 
) 

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 


TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.csrf', 
) 

내 HTML 코드는 다음과 같다 :

<form action = "/myprofile/" method = "post"> {% csrf_token %} 
    <ul> 
    {{ form.as_ul }} 
    </ul> 

    <input type = "submit" name = "Submit" value = "Edit Form"> 
</form> 
나는 또한 숨겨진 입력으로 토큰을 추가하는 시도하십시오하지 않는 것이

,하지만이있다 내 문제를 해결하지 못했습니다. 이 뷰를 생성하는 함수는 폼의 동작 인 <form action = "/myprofile/" ...>과 동일한 함수이기도합니다.

이 문제에 대한 도움을 주시면 감사하겠습니다.

답변

4

귀하의 문제는 여기에 있습니다 :

당신은 CSRF 추가했지만
return render_to_response('myprofile.html',{},RequestContext(request)) 

:

c = {} 
c.update(csrf(request)) 

당신은 c와 아무것도하지합니다.

from django.shortcuts import render, redirect 

def edit(request): 
    form = StudentForm(request.POST or None) 
    if form.is_valid(): 
     form.save() 
     return redirect('/myprofile/') 
    return render(request, 'myprofile.html', {'form': form}) 

다음, 템플릿, 당신은 둘 다와 {{ csrf_token }}{% csrf_token %}를 사용하지 않을 : 단지는 render shortcut 사용, 한번에 모두이 문제를 해결합니다.태그는 양식 필드를 렌더링합니다.

+1

도움 주셔서 감사합니다. 귀하의 제안을 따랐지만 여전히 동일한 오류가 발생했습니다. 따라서이 문제는 파일 안의 원시 코드가 아닌 내 코드의 다른 측면에서 발생할 수 있다고 생각됩니다. – PyUnchained

2

는 {{csrf_token는}}은 비어있는 것으로 보인다 {% csrf_token %}에 의해 생성되는 숨겨진 입력 필드를 무시합니다. 템플릿에서 {{csrf_token}}으로 숨겨진 입력 필드를 제거하면됩니다.

RequestContext 또한 CSRF 토큰을 템플릿에 수동으로 추가 할 필요가 없으므로 다음 코드를보기에서 제거 할 수 있습니다.

c = {} 
c.update(csrf(request)) 

자세한 내용은 https://docs.djangoproject.com/en/1.6/ref/contrib/csrf/#how-csrf-works을 참조하십시오.

+0

응답 해 주셔서 감사합니다. 나는 Khalid의 대답에 대해서만 논평했다. 귀하의 링크는 제가 놓친 매우 유용한 추가 정보를 제게 제공했지만, 제 문제를 해결하지는 못했습니다. – PyUnchained