2017-03-07 2 views
0

장고 앱 (1.7에서 1.10 및 Django Rest Framework에서 3.5.4로)에 대한 주요 업그레이드로 인해 또 다른 문제가 발생했습니다. 가입 페이지에서 500 오류를 일으키는 다른 오류를 해결할 수 있었지만 여전히 CSRF 토큰에 문제가 있습니다. 이 기능은 업그레이드 전에 작동했습니다. 나는 (내가 DEBUG = TRUE가) 페이징 오류에 언급 된 모든 것을 확인했지만, 준수로 모든 확인을 보인다 : 클래스에서Django CSRF 토큰이 등록 양식에서 누락되었습니다.

을 "CompanyAdmin"나는 가입하는 방법이 있습니다

def signup(self, request): 
    if request.method == "GET": 
     form = SignupForm() 
    else: 
     form = SignupForm(request.POST) 

     if form.is_valid(): 
      company = form.save() 
      user = company.managers.all()[0] 
      user = authenticate(
       email=user.email, password=request.POST["password1"]) 
      if user is not None: 
       login(request, user) 
       return HttpResponseRedirect(reverse("bagdisken:index")) 

    return shortcuts.render_to_response("bagdisken/signup.html", 
             context=RequestContext(request, { 
              'form': form, 
             })) 

컨텍스트에 문제가있어서 500 개의 오류가 발생했습니다.이 오류는 컨텍스트에서 요청을 추가하여 해결됩니다. 이전 그것은 같았다 :

return shortcuts.render_to_response("bagdisken/signup.html", {'form': form}) 

CSRF 토큰 뷰에 존재한다 :

{% extends "admin/base_site.html"%} 
{% load form_utils %} 
{% block content_title%}{% endblock %} 
{% block breadcrumbs %}{% endblock %} 
{% block nav-global %}{% endblock %} 
{% block coltype %}twelve columns offset-by-two{% endblock %} 
{% block content%} 
    <form id="signup" action="#" method="POST" > 
     {% csrf_token %} 
      {{ form|render }} 
      <input type="submit" value="Submit" /> 
    </form> 
{% endblock %} 

그리고 CsrfViewMiddleware 설정 방법도 존재한다 :

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'corsheaders.middleware.CorsMiddleware', 
# Uncomment the next line for simple clickjacking protection: 
# 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

또, 숨겨진 입력 csrf 토큰이 없기 때문입니다. 문제를 어떻게 해결할 수 있습니까?

답변

3

render_to_response을 사용하지 마십시오. 더 이상 사용되지 않습니다. 응답에서 요청을 사용할 수 없으므로 CSRF 템플릿 컨텍스트 프로세서가 작동하지 않습니다.

render 바로 가기를 대신 사용하십시오. 템플릿을 요청으로 렌더링하므로 CSRF 토큰이 작동합니다.

from django.shortcuts import render 

def signup(self, request): 
    ... 
    return render(request, "bagdisken/signup.html", {'form': form}) 
+0

부끄러움처럼 작용했습니다. 감사합니다. –

관련 문제