2012-10-04 4 views
3

그래서 금단 (403) CSRF 확인에 실패했습니다. 요청이 중단되었습니다. 실패 이유 : CSRF 토큰 누락 또는 부정확.
내 middleware_classes에 'django.middleware.csrf.CsrfViewMiddleware'가 있습니다. 가 여기 내 템플릿Django --CSRF 토큰이 없거나 잘못되었습니다.

<form name="input" action="/login/" method="Post"> {% csrf_token %} 
<input type="submit" value="Submit"></form> 

것은 여기

from django.shortcuts import render_to_response 
from django.core.context_processors import csrf 
from django.template import RequestContext 
def login(request): 
    csrfContext = RequestContext(request) 
    return render_to_response('foo.html', csrfContext) 

그럼 내가 장고 대부분의 웹 개발에 새로운 오전 내보기,하지만 난 여기에 문제를 찾을 수 없습니다. 어떤 도움을 많이 주시면 감사하겠습니다! 여기

def login(request): 
    context = {} 
    request_context = RequestContext(request) 
    return render_to_response('foo.html', context, 
           request_context=request_context) 

render_to_response에 대한 official docs 있습니다

또한 당신이 다음을 수행해야 장고 문서

c = {} 
c.update(csrf(request)) 
# ... view code here 
return render_to_response("a_template.html", c) 
+2

단점 참고 : 장고를 처음 사용하는 사람이라면 모든 것을 클래스 기반 뷰로 볼 수 있습니다. 단지'post'를 오버라이드하는 경우라도 서버가 응답 할 HTTP 요청 유형을 적어도 강제합니다. – Arion

+0

이 (가) 어떤 템플릿 /보기입니까? –

+0

템플릿에'{% csrf_token %} '을 (를) 추가해야합니다. 'RequestContext'가 존재하는지 확인하십시오. 물론 각 미들웨어는'settings.py'와 ..에 있습니다. 문제가 지속되면. 확실하지는 않지만 ..'@ csrf_exempt' 데코레이터 등을 시도해보십시오. – Surya

답변

2

로그인 기능 바로 전에 @csrf_protect 데코레이터를 추가하십시오.

from django.views.decorators.csrf import csrf_protect 

@csrf_protect 
def login(request): 
    csrfContext = RequestContext(request) 
    return render_to_response('foo.html', csrfContext) 

형태가 foo.html을하지 않을 경우

는 당신이 그것을 생성하는 뷰 기능에 @csrf_protect 방법을 추가해야합니다.

+0

시도해 보았지만 여전히 같은 오류가 발생했습니다. render_to_response 구문을 수정하여 위의 제안을 시도했습니다 ... – daabears

+0

다른 페이지에서/login /에 게시하고 다른 페이지에 @ 그것에 대한 csrf_protect? 귀하의 댓글에있는 템플릿 텍스트는 어떤 페이지입니까? 생성되는 HTML을보고 csrf_protect 토큰이 있는지 확인하십시오. –

+0

아, 그 덕분에, 많은 감사합니다! – daabears

0

의 방법을 시도했다.

+0

여전히 동일한 오류가 발생하면서 개선없이 @csrf_protect 데코레이터를 사용해 보았습니다 ... – daabears

+0

html에서 csrf 토큰이 보이십니까? 그렇지 않다면'requires_csrf_token' 데코레이터를 추가하십시오. – miki725

2

나는 당신과 같은 문제가 있었고이 문제를 해결하는 코드를 발견했습니다.

from django.views.decorators.csrf import csrf_exempt 
from django.shortcuts import render 
from django.contrib import auth 

#in accounts.forms i've placed my login form with two fields, username and password 
from accounts.forms import LoginForm 

@csrf_exempt 
def login(request): 
    if request.method == "POST": 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
     user = auth.authenticate(
       username=form.cleaned_data["username"], 
       password=form.cleaned_data["password"]) 
       auth.login(request, user) 
       return HttpResponseRedirect("/") 
     else: 
     form = LoginForm() 

return render(request, 'accounts/login.html', {'form':form}) 
+1

csrf_exempt를 추가하면이 작업이 필요하지 않아 사이트가 취약해질 수 있습니다. 이 데코레이터는 이러한 종류의 요청이 특별히 필요하고 위험을인지하고 다른 예방 조치를 취한 경우에 유용합니다. – Andre

관련 문제