javascript - Django 表单提交中缺少 CSRF 令牌
问题描述
我正在尝试通过 ajax 提交表单。我的模板如下:-
<form method="POST" id="form1" class="SignUP signupform">
<div class="classheading">Sign-up</div>
{% csrf_token %}
<input type="text" name="user" placeholder="Username" class="sinput" required="true" />
<input type="text"name="email" placeholder="Email" class="sinput" required="true"/>
<input type="password"name="password"placeholder="Password" class="sinput" required="true"/>
<input type="password"placeholder="Re-enter Password" class="sinput" required="true"/>
<button type="submit" class="subform">Sign Up</button>
</form>
而提交此表单的ajax视图是:-
$(document).ready(function(){
$('#form1').submit(function(){
console.log('form is submitted');
var csrftoken = $("[name=csrfmiddlewaretoken]").val();
var formdata={
'username':$('input[name=user]').val(),
'email':$('input[name=email]').val(),
'password1':$('input[name=password]').val(),
'password2':$('input[name=password1]').val(),
};
console.log("Formvalue is taken");
$.ajax({
type:'POST',
url:'/Submit/signingup',
data:formdata,
dataType:'json',
encode:true,
headers:{
"X-CSRFToken": csrftoken
},
})
.done(function(data){
console.log(data);
});
event.preventDefault();
});
});
在后端,我使用 Django 提交此表单。对应视图如下:-
@csrf_protect
def signup(request):
if request.method == 'POST':
form = SignupForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
current_site = get_current_site(request)
mail_subject = 'Activate your blog account.'
message = render_to_string('acc_active_email.html', {
'user': user,
'domain': current_site.domain,
'uid':urlsafe_base64_encode(force_bytes(user.pk)).decode(),
'token':account_activation_token.make_token(user),
})
to_email = form.cleaned_data.get('email')
email = EmailMessage(
mail_subject, message, to=[to_email]
)
email.send()
return HttpResponse("Confirm your email.")
else:
return JsonResponse({'success': False,'errors': [(k, v[0]) for k, v in form.errors.items()]})
但它显示 403 错误。在命令提示符下,它显示“CSRF_TOKEN 丢失或不正确”。可能的错误是什么?
解决方案
像这样在打开标签之后放置 csrf_token 。并尝试
<form method="POST" id="form1" class="SignUP signupform">{% csrf_token %}
推荐阅读
- c# - 带有 Azure 函数的 Swashbuckle - 定义查询参数
- dictionary - 如何获取 Pyspark 中每一行的字数字典?
- javascript - 本地代理应用程序作为 SaaS 的“窗口”?
- mysql - 如何将带或不带负号的整数转换为 CONVERT_TZ 的时区偏移量?
- ruby-on-rails - 我的索引页面加载缓慢。如何减少加载时间?
- java - 如何在 JavaFX 中继续循环之前等待媒体结束?
- django - 为什么 Django 不连接到 SQL Server 2019?
- typescript - 如何在 Nativescript 的底部导航中添加操作栏
- node.js - 发现 1 个低严重性漏洞
- c++ - CMake 错误:在 Mac OS 上使用 clang 找不到 OpenMP_C(缺少:OpenMP_C_FLAGS)