[python] Django CSRF 쿠키가 설정되지 않음

잠시 동안 문제가 발생했습니다. CSRF 쿠키가 설정되지 않았습니다. 아래 코드를보세요

파이썬

def deposit(request,account_num):
if request.method == 'POST':
    account = get_object_or_404(account_info,acct_number=account_num)
    form_=AccountForm(request.POST or None, instance=account)
    form = BalanceForm(request.POST)
    info = str(account_info.objects.filter(acct_number=account_num))
    inf=info.split()
    if form.is_valid():
    #cd=form.cleaned_data
        now = datetime.datetime.now()
        cmodel = form.save()
        cmodel.acct_number=account_num
        #RepresentsInt(cmodel.acct_number)
        cmodel.bal_change="%0.2f" % float(cmodel.bal_change)
        cmodel.total_balance="%0.2f" %(float(inf[1]) + float(cmodel.bal_change))
        account.balance="%0.2f" % float(cmodel.total_balance)
        cmodel.total_balance="%0.2f" % float(cmodel.total_balance)
        #cmodel.bal_change=cmodel.bal_change
        cmodel.issued=now.strftime("%m/%d/%y %I:%M:%S %p")
        account.recent_change=cmodel.issued
        cmodel.save()
        account.save()
        return HttpResponseRedirect("/history/" + account_num + "/")
    else:
        return render_to_response('history.html',
                          {'account_form': form},
                          context_instance=RequestContext(request))

여기 HTML에 코드가 있습니다.

HTML

<form action="/deposit/{{ account_num }}/" method="post">

<table>
<tr>
{{ account_form.bal_change }}
&nbsp;
<input type="submit" value="Deposit" />
</tr>
{% csrf_token %}
</table>
</form>

Im 붙어서 이미 쿠키를 지우고 다른 브라우저를 사용했지만 여전히 csrf 쿠키가 설정되지 않았습니다.



답변

CSRF_COOKIE_SECURE = True설정되어 있고 사이트에 안전하지 않게 액세스하거나 여기여기에CSRF_COOKIE_HTTPONLY = True 명시된대로 설정된 경우에도 발생할 수 있습니다.


답변

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt 
def your_view(request):
    if request.method == "POST":
        # do something
    return HttpResponse("Your response")


답변

당신이 사용하는 경우 HTML5를 API를 가져 오기 A가 사용자와 점점 기록으로 POST 요청을하기 위해 Forbidden (CSRF cookie not set.)기본적으로 있기 때문에 수, fetch페이지를로드가 아닌 다른 사용자 인 생각 장고의 결과로, 세션 쿠키를 포함하지 않는다 .

credentials: 'include'가져 오기 옵션 을 전달하여 세션 토큰을 포함 할 수 있습니다 .

var csrftoken = getCookie('csrftoken');
var headers = new Headers();
headers.append('X-CSRFToken', csrftoken);
fetch('/api/upload', {
    method: 'POST',
    body: payload,
    headers: headers,
    credentials: 'include'
})


답변

에서
당신은 추가하여 해결할 수 ensure_csrf_cookie의 장식을 보기에

from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
 #...

이 방법이 작동하지 않는 경우. 미들웨어에서 csrf를 주석 처리하려고합니다. 다시 테스트하십시오.


답변

DRF로 작업하는 동안 비슷한 상황이 발생했으며 솔루션은 urls.py의 View에 .as_view () 메서드를 추가했습니다.


답변

DRF를 사용하는 경우 urlpattern이 올바른지 확인하십시오 .as_view().

그래서 내 코드는 다음과 같이 보입니다.

urlpatterns += path('resource', ResourceView)

다음과 같이해야합니다.

urlpatterns += path('resource', ResourceView.as_view())


답변

settings.py에 설치했는지 확인하십시오.

 MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',)

템플릿에서 데이터는 csrf_token으로 형식이 지정됩니다.

<form>{% csrf_token %}
</form>