AJAX向Django后端提交POST请求
2024-08-29 01:55:00
一、ajax登录示例
urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login_ajax/$', views.login_ajax, name='login_ajax'),
url(r'^index/$', views.index, name='index'),
]
views.py
from django.shortcuts import render, HttpResponse, redirect
import json
def index(request):
return HttpResponse('this is index')
def login_ajax(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
ret = {"status": 0, 'url': ''}
if user == "alex" and pwd == "123":
ret['status'] = 1
ret['url'] = '/index/'
return HttpResponse(json.dumps(ret))
return render(request, "login_ajax.html")
login_ajax.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>登录</title>
<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
<link rel="stylesheet" href="/static/css/signin.css">
</head>
<body>
<div class="container">
<form class="form-signin" action="{% url 'login' %}" method="post">
{% csrf_token %}
<h2 class="form-signin-heading">请登录</h2>
<label for="inputUser" class="sr-only">用户名</label>
<input type="text" id="inputUser" class="form-control" placeholder="用户名" required="" autofocus="" name="user">
<label for="inputPassword" class="sr-only">密码</label>
<input type="password" id="inputPassword" class="form-control" placeholder="密码" required="" name="pwd">
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> 记住我
</label>
</div>
<input class="btn btn-lg btn-primary btn-block" id="login" value="登陆">
</form>
</div> <!-- /container -->
<script src="/static/jquery-3.3.1.min.js"></script>
<script>
$('#login').click(function () {
$.ajax({
url: '/login_ajax/',
type: 'post',
data: {
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
user: $('[name="user"]').val(),
pwd: $('[name="pwd"]').val()
},
success: function (data) {
data = JSON.parse(data);
if (data.status) {
window.location = data.url
}
else {
alert('登陆失败')
}
}
})
})
</script>
</body>
</html>
静态文件需要配置,使用了jQuery和Bootstrap。
二、CSRF跨站请求伪造
方式一
将csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val()
放在POST的请求体中。
示例中就是使用的这种方式。
方式二
给ajax的请增加X-CSRFToken的请求头,对应的值只能是cookie中的csrftoken的值。
所以我们要从cookie中提取csrftoken的值,jQuery不能去cookie,我们使用jquery.cookie的插件。点击下载jquer.cookie插件。
HTML中导入jquery.cookie.js。
<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
$('#login').click(function () {
$.ajax({
url: '/login_ajax/',
type: 'post',
headers:{ "X-CSRFToken":$.cookie('csrftoken') },
data: {
user: $('[name="user"]').val(),
pwd: $('[name="pwd"]').val()
},
success: function (data) {
data = JSON.parse(data);
if (data.status) {
window.location = data.url
}
else {
alert('登陆失败')
}
}
})
})
</script>
方式三
使用$.ajaxSetup()
给全局的ajax添加默认参数。
可以按照方式一设置data
,也可以按照方式二设置请求头。
$.ajaxSetup({
data: {
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
}
});
$.ajaxSetup({
headers: {"X-CSRFToken": $.cookie('csrftoken')},
});
方式四
官方推荐方法(用到jquery.cookie
插件):
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
}
}
});
最新文章
- 浅析String不可变性
- C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别
- .net概念之程序集说明
- 如何获得浏览器localStorage的剩余容量
- &#39;str&#39; object is not callable
- JDE报表开发笔记(R5537011 收货校验统计表)
- Iptables 防火墙开放常见的22,53,80端口
- ASP.NET 使用mode=”InProc”方式保存Session老是丢失,无奈改成StateServer 模式。
- [rxjs] Creating An Observable with RxJS
- c 整数的逆序输出 输入3,2就算 2+22+222的结果
- CareerCup Chapter 4 Trees and Graphs
- 写一些脚本的心得总结系列第4篇-------从数据库同步到redis
- crontab格式使用方式
- A Bit Fun
- Vue 爬坑之路(九)—— 用正确的姿势封装组件
- Linux之解决你的网络问题
- document.wrtie()用法
- hive函数--编码解码
- windows下eclipse实现操作虚拟机ubantu中的hdfs hbase
- Android事件处理第一节(View对Touch事件的处理)
热门文章
- jQuery全选功能
- C# Entity Framework 更新数据的三种方法
- 配置 http 反向代理
- 这样讲 SpringBoot 自动配置原理,你应该能明白了吧
- ADF检验
- ROPE
- vue项目中利用popstate处理页面返回操作
- 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏
- windows 环境如何启动 redis ?
- maven项目使用自己创建的jar包--maven without test code