장고 CSRF 쿠키가 설정되지 않음
CSRF Cookie가 설정되지 않은 상태에서 잠시 문제가 발생했습니다.아래 코드를 참조하십시오.
views.py :
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))
템플릿 파일:
<form action="/deposit/{{ account_num }}/" method="post">
<table>
<tr>
{{ account_form.bal_change }}
<input type="submit" value="Deposit"/>
</tr>
{% csrf_token %}
</table>
</form>
제가 막혀서 쿠키를 이미 지우고 다른 브라우저를 사용했지만 여전히 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 Fetch API를 사용하여 로그인한 사용자로 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'
})
이 페이지에서 보기에 esture_csrf_cookie 데코레이터를 추가하여 해결할 수 있습니다.
from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
#...
만약 이 방법이 효과가 없다면요.당신은 미들웨어에서 csrf를 코멘트하려고 할 것입니다.다시 테스트합니다.
당신이를 사용한다면, 당신의 하세요, 은 DRF를 잊어버렸을 것입니다. 잊어버린 것 같습니다..as_view()
:
그래서 내 코드는 다음과 같이 보였습니다.
urlpatterns += path('resource', ResourceView)
그리고 그것이 바로 그것이 되어야 할 것입니다:
urlpatterns += path('resource', ResourceView.as_view())
DRF와 , 그은 DRF를 이었습니다. 해결책이 임박했습니다..as_view()
에서 보기에 urls.py
.
가 settings.py 에 설치되어 있는지 확인해 보십시오.
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',)
템플릿에서 데이터는 csrf_token으로 포맷됩니다.
<form>{% csrf_token %}
</form>
이 문제는 최근에 Python 자체의 버그로 인해 다시 발생했습니다.
http://bugs.python.org/issue22931
https://code.djangoproject.com/ticket/24280
영향을 받은 버전 중에는 2.7.8과 2.7.9가 포함되어 있습니다.값 중 하나에 다음이 포함된 경우 쿠키를 올바르게 읽지 못했습니다.[
성격.
Python(2.7.10)을 업데이트하면 문제가 해결됩니다.
양식 작업을 설정하지 않은 경우에도 이 문제가 발생합니다.
" 코가다같을때이오표류시다습니었되가음과드다니습▁when▁for었표▁this"일 때 이 .
<form class="navbar-form form-inline my-2 my-lg-0" role="search" method="post">
내 코드를 다음으로 수정했을 때:
<form class="navbar-form form-inline my-2 my-lg-0" action="{% url 'someurl' %}" role="search" method="post">
제 실수가 사라졌습니다.
당신이 않경우는지를 .{% csrf_token %}
렌더링할 템플릿의 태그입니다.장고가 csrftoken cookie를 설정하지 않습니다.
django가 csrftoken 쿠키를 설정하도록 하려면 보기에 esture_csrf_cookie 데코레이터를 추가합니다.
from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def myview(request):
저의 경우, 문제는 장고를 사용하고 있었다는 것입니다.rest_framework
그리고 내 기능에 다음 장식자를 추가하는 것을 잊었습니다.
from rest_framework.decorators import api_view, renderer_classes
@api_view(('POST',))
@renderer_classes((JSONRenderer,))
def handle_web_request(request):
...
경우에는 내경우, 정설정을 합니다.CSRF_COOKIE_SECURE
False
충분하지는 않았지만 그것을 설정했습니다.Null
작동한 매개 변수를 지정하지 않았습니다.
저의 경우 nginx의 정적 파일 경로가 잘못 지정된 것이 문제였습니다.
sudo tail -F /var/log/nginx/error.log
파일 경로에 오류가 있는지 확인합니다.
다음 오류가 발생하여 변경합니다.
<form method="post">
대상:
<form method="POST">
그리고 그것은 해결되었습니다! 단지 대문자로 글을 올리면 문제가 생깁니다! 저는 127.0.0.1에서 이것에 아무런 문제가 없지만, 제가 192.168.x.x 주소를 사용할 때 이것은 제 양식을 깨뜨렸습니다.
이 문가해않것같다니습는제지를 처리하지 않는 것 .GET
먼저 양식을 가져오지 않고 데이터를 적절하게 또는 직접 게시하도록 요청합니다.
하면, 는 페지에처액하클면다전가다송니합음을트언라이이음세를 보낼 것입니다.GET
요청합니다. 그런 경우에는 적절한 양식과 함께 html을 보내야 합니다.
나중에 사용자가 양식을 작성하여 전송합니다.POST
양식 데이터가 포함된 요청입니다.
보기는 다음과 같습니다.
def deposit(request,account_num):
if request.method == 'POST':
form_=AccountForm(request.POST or None, instance=account)
if form.is_valid():
#handle form data
return HttpResponseRedirect("/history/" + account_num + "/")
else:
#handle when form not valid
else:
#handle when request is GET (or not POST)
form_=AccountForm(instance=account)
return render_to_response('history.html',
{'account_form': form},
context_instance=RequestContext(request))
크롬의 쿠키가 웹 사이트에 대한 기본 옵션으로 설정되어 있는지 확인합니다.로컬 데이터를 설정할 수 있습니다(권장).
저는 예전에 장고 1.10을 사용했습니다.그래서 저는 이 문제에 직면했습니다.지금은 장고 1.9로 다운그레이드해서 정상적으로 작동하고 있습니다.
저도 같은 오류가 있었습니다. 저의 경우 method_decorator를 추가하면 다음과 같은 도움이 됩니다.
from django.views.decorators.csrf import csrf_protect
from django.utils.decorators import method_decorator
method_decorator(csrf_protect)
def post(self, request):
...
settings.py 에서 django 세션 백엔드가 올바르게 구성되었는지 확인합니다.그럼 이거 먹어봐요.
class CustomMiddleware(object):
def process_request(self,request:HttpRequest):
get_token(request)
를 이미웨추위에 합니다.settings.py
MIDDLEWARE_CLASSES
또는MIDDLEWARE
버전에 .
get_token - POST 양식에 필요한 CSRF 토큰을 반환합니다.토큰은 영숫자 값입니다.토큰이 아직 설정되지 않은 경우 새 토큰이 만들어집니다.
한 번 만난 적이 있는데, 해결책은 쿠키를 비우는 것입니다. 디버깅 될 수 .SECRET_KEY
관련된.
누군가가 같은 분야를 넘나들 수 있기 때문에 여기서 제 사례를 지적하고 싶습니다.
Forbidden (CSRF cookie not set.): /main/staff/products/validation/create
HTTP POST /main/staff/products/validation/create 403 [0.01, 127.0.0.1:55940]
이 일 때문에 미치겠어요CSRF 미들웨어에 대해 언급함으로써
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
)
그것은 나를
POST Method not allowed.
그게 결국 제 힌트였어요.Post 메서드가 있다고 확신했습니다.알고보니 나의url_patterns
정규식 버그에 의한 다른 보기로 이어지고 있었습니다.
그래서 내가 무슨 짓을 했든 간에@csrf_exempt @ensure_crsf_cookie
, 고찾있다.as_view()
저는 잘못된 견해를 보고 있었습니다.
따라서 아무 것도 작동하지 않는 경우 실제로 올바른 보기로 전송되는지 확인합니다.
SSL이 없는 Django 애플리케이션을 배포하는 동안 이 오류가 발생할 수 있습니다. 이 경우 백엔드 앞에 SSL 역방향 프록시 또는 SSL 구성 입력을 배치하면 문제가 해결됩니다.
방법 1:
from django.shortcuts import render_to_response
return render_to_response(
'history.html',
RequestContext(request, {
'account_form': form,
})
방법 2:.
from django.shortcuts import render
return render(request, 'history.html', {
'account_form': form,
})
왜냐면render_to_response
메소드는 응답 쿠키의 일부 문제를 발생시킬 수 있습니다.
브라우저의 캐시를 지우는 것으로 이 문제가 해결되었습니다.저는 다른 프로젝트를 진행한 후 장고-블로그-지니아 튜토리얼을 하기 위해 현지 개발 환경을 전환하고 있었습니다.처음에, 저는 순서를 바꾸는 것을 생각했습니다.INSTALLED_APPS
튜토리얼이 원인이 되었지만 캐시를 지울 때까지 수정할 수 없었습니다.
저는 이 해결책을 시도해 보았습니다. 저에게 효과가 있습니다.은 야해합니다설을 설정해야 .CSRF_USE_SESSIONS
True
기본적으로 csrf 토큰은 세션 https://docs.djangoproject.com/en/4.1/ref/settings/ #std-setting-CSRF_USE_SESSINS에 저장됩니다.
당신이 보기에 당신은 csrf 데코레이터를 사용하고 있습니까?
from django.views.decorators.csrf import csrf_protect
@csrf_protect def view(request, params): ....
언급URL : https://stackoverflow.com/questions/17716624/django-csrf-cookie-not-set
'programing' 카테고리의 다른 글
문자열에서 따옴표를 제거하려면 어떻게 해야 합니까? (0) | 2023.09.05 |
---|---|
ID 대신 이름으로 요소의 값을 가져오는 방법 (0) | 2023.09.05 |
Powershell Echo 문 + 한 줄의 변수 (0) | 2023.09.05 |
Google Chrome에 대해 자동 로그온 사용자 인증을 활성화하는 방법 (0) | 2023.09.05 |
달러(약)ready(함수:{}); 페이지 하단의 vs 스크립트 (0) | 2023.08.31 |