Django-Ajax
一、Ajax介绍
AJAX(Asynchronous Javascript And XML)翻译成中文就是 “ 异步的Javascript和XML ”。
- Ajax不是新的编程语言,而是一种使用现有标准的新方法。
- Ajax最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
- Ajax不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上运行。
Ajax常见应用情景:
- 搜索引擎根据用户输入的关键字,自动提示检索关键字。
- 注册时候的用户名的查重。
优点:
- Ajax使用JavaScript技术向服务器发送异步请求
- Ajax请求无须刷新整个页面
- 应为服务器响应内容不再是整个页面,而是页面中的部分内容,所以Ajax性能高
两大特性
- 异步请求:客户端发送一个请求后,无需等待服务器响应结束就可以发第二个请求
- 局部刷新:(这一特点给用户感受是在不知不觉中完成请求和响应过程)
例子:通过Ajax请求判断用户名密码是否输入错误,并且不刷新网页,只在对应密码后面提示!,验证正确通过js跳转页面。
login.html 页面
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎登录页面</h1>
<form action="">
{% csrf_token %}
<label for="username">用户名:</label><input type="text" id="username">
<label for="password">密码:</label><input type="password" id="password">
<input type="button" value="确认" id="d1">
</form>
<script src="{% static 'js/jQuery.js' %}"></script>
<script>
let state = true;
$('#d1').click(function () { // 触发点击事件
$.ajax({
url: "{% url 'login' %}", // 请求地址
type: 'post', // 请求方法
data: { // 请求数据
'uname': $('#username').val(),
'pwd': $('#password').val(),
'csrfmiddlewaretoken': '{{ csrf_token }}', // post请求提交csrf_token数据
},
success: function (ret) { // 获取返回参数并且自动序列化ret,并且执行function方法
if (ret['state'] === 3) {
// 用户密码验证成功,进行跳转到服务器返回的指定地址
location.href = ret['url'];
} else if (ret['state'] === 0) {
// 验证失败,创建标签并添加内容,插入到form表单之后,只插入一次。
if (state) {
const p = document.createElement("span");
p.innerText = ret['error'];
$('form').append(p);
state = false;
}
}
},
})
})
</script>
</body>
</html>
views.py 文件
from django.shortcuts import render, reverse
from django.http import JsonResponse
from django.views import View
class Login_view(View):
def get(self, request):
return render(request, 'login.html')
def post(self, request):
name = request.POST.get('uname')
pwd = request.POST.get('pwd')
if name == 'xiaoyang' and pwd == '123':
data = {'state': 3, 'url': reverse('index')}
return JsonResponse(data) # 以json格式发送data字典
else:
data = {'state': 0, 'error': '用户名或密码错误'}
return JsonResponse(data)
def index(request):
return render(request, 'index.html')
二、Ajax参数
请求参数
date:
当前Ajax请求要携带的数据,是一个json的object对象,Ajax方法就会默认把它编码成某种格式
function f() {
$.ajax({
url: '/index/',
type: 'get',
data: { // 此时data是一个json形式的对象
'k1': 'v1',
'k2': 'v2',
},
})
}
processData:
声明当前data数据是否进行转码或预处理,默认为true,即预处理;
如果是false,那么对data:{'k1':'v1', 'k2':'v2'} 会调用json对象的toString( ) 方法,也就是{'k1':'v1', 'k2':'v2'}.toString( ),最后得到一个[object, Object]形式的结果
function f() {
$.ajax({
url: '/index/',
type: 'get',
processData: false,
data: { // 此时data是[object, Object]
'k1': 'v1',
'k2': 'v2',
},
})
}
contentType:
默认值:"application/x-www-form-urlencoded"
是发送信息到服务器时内容编码类型,用来指明当前请求的数据编码格式;
比如:contentType:"application/json",向服务器发送一个json字符串。
function f() {
$.ajax({
url: '/index/',
type: 'post',
processData: false,
data: {
'k1': 'v1',
'k2': 'v2',
},
contentType: 'application/json',
})
}
// 一旦设定,data必须使json字符串,不能是json对象
// wiews.py 文件:json.loads(request.body.decode('utf8'))
响应参数
dataType:
把服务器返回的数据类型根据这个值解析后,传递给回掉函数。
默认不需要指定这个属性,Ajax会根据服务器返回的 content Type 来进行转换。
例如:
我们服务器响应的 content Type为json格式,这时Ajax方法就会对响应的内容进行一个json格式的转换,如果转换成功,我们在 success 的回调函数里就会得到一个json格式的对象:转换失败就会触发error这个回调函数。如果明确的指定目标类型,就可以使用 data Type。
dataType的可用值:html、xml、json、text、script
function f() {
$.ajax({
url: '/index/',
type: 'get',
dataType: 'json',
data: {'obj': 'getjson'},
success: function (ret) {
console.log(ret); // 此时会自动将返回的字符串转换成json对象。
},
error: function () {
alert('转换失败!');
}
})
}
三、json时间格式转换
import json
from datetime import datetime
from datetime import date
# 对含有日期格式数据的json数据进行转换
class JsonCustomEncoder(json.JSONEncoder):
def default(self, field):
if isinstance(field,datetime):
return field.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(field,date):
return field.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self,field)
d1 = datetime.now()
dd = json.dumps(d1,cls=JsonCustomEncoder) # 转换
print(dd)
本文来自博客园,作者:Mr-Yang`,转载请注明原文链接:https://www.cnblogs.com/XiaoYang-sir/articles/14927644.html