一. ajax的两种crsf验证
# 1. 在试图函数上加上装饰器
# 2. ajax提交数据时,携带csrf: 放在data中携带
# 引用的js:
https://cdn.bootcss.com/jquery/1.12.1/jquery.min.js
1. @csrf_exempt装饰器
@csrf_exempt
def login(request):
if request.method == "POST":
return JsonResponse({"code": 0, "msg": "登陆成功"})
return render(request, "login.html")
<form>
<input type="text" id="username" name="username">
<a onclick="submitForm();">Ajax提交</a>
</form>
<script src="https://cdn.bootcss.com/jquery/1.12.1/jquery.min.js"></script>
<script>
function submitForm() {
$.ajax({
url: "/hello/login/",
type: "POST",
data: {
"user": $("#username").val(),
},
success: function (arg) {
console.log(arg)
}
})
}
</script>
2. data中携带(绑定函数)
def handle_ajax(request):
if request.is_ajax():
return JsonResponse({"code": 0, "msg": "登陆成功"})
return render(request, "ajax.html")
<form>
{% csrf_token %}
<input type="text" id="username" name="username">
<a onclick="submitForm();">Ajax提交</a>
</form>
<script src="https://cdn.bootcss.com/jquery/1.12.1/jquery.min.js"></script>
<script>
function submitForm() {
var csrf = $('input[name="csrfmiddlewaretoken"]').val();
console.log(csrf)
var user = $('#username').val();
$.ajax({
url: "/hello/ajax/",
type: "POST",
data: {"user": user, 'csrfmiddlewaretoken': csrf},
success: function (arg) {
console.log(arg)
}
})
}
</script>
3. data中携带(使用id)
def register(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
# ajax请求,一般返回json格式数据
return JsonResponse({"code":1})
return render(request, "app03/register.html")
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
用户名:<input type="text" name="username"><br>
密码:<input type="text" name="password"><br>
<input type="button" value="注册" id="button">
</form>
# 1. 部分提交
<script src="https://cdn.bootcss.com/jquery/1.12.1/jquery.min.js"></script>
<script>
$("#button").click(function(){
username=$("[name=username]").val();
password=$("[name=password]").val();
csrf = $("[type=hidden]").val();
console.log(username,password,csrf);
{# 第一个参数:地址;第二个:参数;第三个:返回的数据; #}
$.post("/register/",{"username":username,"password":password,"csrfmiddlewaretoken":csrf},
function(data){
console.log(data)
})
})
</script>
</body>
</html>
# 2. 直接提交form表单所有内容:使用serialize()
<script src="https://cdn.bootcss.com/jquery/1.12.1/jquery.min.js"></script>
<script>
$("#button").click(function () {
$.post("/register/", $("form").serialize(),function (data) {
console.log(data)
})
})
</script>
</body>
</html>
二. 前后端分离处理csrf
# 1. 视图函数向服务器发送请求获取token
from django.middleware.csrf import get_token
# /api/gettoken 这个是地址 url路由的配置就是这个,我下面就不介绍怎么配置路由了,比较简单
class GetTokenView(View):
# 向服务器请求token
def get(self, request):
token = get_token(request)
return JsonResponse({'res':0, "token":token})
# 2. 前端接收token,添加到请求头中
$(document).ready(function(){
// 在页面加载的时候,先向服务器获取token
$.ajax({
url:"http://127.0.0.1:8000/api/gettoken",
dataType: "json",
type: "GET",
success:function (req) {
if ("0" == req.res){
csrftoken = req.token; // 接受上边视图函数返回的token,保存到全局变量中
document.cookie = 'csrftoken=' + req.token; // token设置到cookie中
}
else {
alert("获取token失败") // 可以不要,是用来我们测试的
}
}
})
})