2014-08-27 4 views
0

사용자가 "아이디어"를 입력하고 데이터베이스에 저장할 수있는 웹 페이지를 작성하려고합니다. 폼의 Post 메서드를 사용하고 싶습니다. django page의 지침에 따라 시도했지만 인증은 여전히 ​​실패합니다.장고 CSRF 토큰 인증 실패

이 내 양식 코드 :

<form action="/" method="post"> 
    {% csrf_token %} 
    <p> Title: </p> <input type="text" name="title"> </br> 
    <p> Details: </p> <input type="text" name="details"> 
    <input type="submit" value="Post"> 
</form> 

내 URLconf는 / 라인과 Ideas.views.home에 리디렉션

url(r'^$', 'Ideas.views.home' , name='home') 

뷰 자체는 나는 또한이 일을 시도

from django.shortcuts import render, render_to_response 
from django.http import HttpResponse 
from django.template import loader, Template, Context, RequestContext 
from django.core.context_processors import csrf 
from Ideas.models import Idea 


# Create your views here. 
def home(request): 
    if request.method == 'POST': 
     submitted = Idea.objects.create(title=request.POST['title'], detail=request.POST['details'], votes=0) 
     submitted.save() 
    m = RequestContext(request, {"passed_ideas": Idea.objects.all()}) 
    return render_to_response('basic.html', m) 

입니다 :

from django.shortcuts import render, render_to_response 
from django.http import HttpResponse 
from django.template import loader, Template, Context, RequestContext 
from django.core.context_processors import csrf 
from Ideas.models import Idea 


# Create your views here. 
def home(request): 
    c = {} 
    c.update(csrf(request)) 
    if request.method == 'POST': 
     submitted = Idea.objects.create(title=request.POST['title'], detail=request.POST['details'], votes=0) 
     submitted.save() 
    c['passed_ideas'] = Idea.objects.all() 
    return render_to_response('basic.html', c) 

CSRF 인증을 작동 시키려면 어떻게해야합니까?

+1

보기에 @csrf_exempt 데코레이터를 사용하면 csrf 토큰 유효성 검사가 필요 없습니다. 작동하면 더 많이 파고들 수 있습니다. – MartinM

+0

@MartinM 고맙습니다. 적어도 지금은 개발을 계속할 수 있습니다! – elder4222

+0

아무 문제 없어, klasske의 대답을보세요 – MartinM

답변

0

예, 렌더링 사용, 또는 당신과 같이 응답 렌더링에 crsf를 추가 할 수 있습니다

render_to_response('basic.html', add_csrf(request, ***other context***)) 


from django.core.context_processors import csrf 
def add_csrf(request, ** kwargs): 
    """Add CSRF and user to dictionary.""" 
    d = dict(user=request.user, ** kwargs) 
    d.update(csrf(request)) 
    return d 

하지 내가이 옵션을 좋아하지만, 이것이 내가 그것을 어떻게입니다. RequestContext 더 나은 옵션을 생각합니다.

0

몇 주 전에 비슷한 문제가있었습니다. '/'를 사용하여 URL로 리디렉션하면 CSRF 토큰이 삭제됩니다. 그 문제의 경우, 라우터에 거짓 trailing_slash을 = 추가

# urls.py 
router = DefaultRouter(trailing_slash=False) 

urlpatterns = patterns('', 
    url(r'^$', views.IndexView.as_view(), name='home'), 
    #all of your urls go here 
) 

이 리디렉션을 제거하는 것이며, CSRF 토큰을 통해 제공한다.

+0

죄송합니다, 저는 장고 n00b입니다. 설정 파일에 있습니까? 내 – elder4222

+0

, 그 urls.py에. 다음과 같이 보입니다 : router = DefaultRouter (trailing_slash = False) urlpatterns = patterns ('', ...) –

0

나는 당신이 순서 당신이 토큰 당신의 CSRF 도움

return render_to_response('basic.html', c, context_instance=RequestContext(request)) 
+0

두 번째 코드를 사용할 때 (c.update (crsf (request))) – elder4222

+0

예, 당신은'csup (csrf (request))'를 제거 할 수 있습니다. – klasske

+0

그게 작동하지 않았다 : ( – elder4222

0

모두에게 감사를 처리하는 템플릿을 렌더링 할 때 context_instance=RequestContext(request)를 추가 할 필요가 있다고 생각하지만,

return render(request, ...) 

return render_to_response(...) 

로 전환

마침내 수정 됨

+0

이후, 비슷한 (똑같은 것은 아니지만) 게시물을 발견 : http://stackoverflow.com/questions/10388033/csrf-verification-failed-request-aborted?rq = 1 – elder4222