什么是json

json是轻量级文本数据交互格式

json独立语言

符合的json对象

["one", "two", "three"]
{ "one": 1, "two": 2, "three": 3 }
{"names": ["张三", "李四"] }
[ { "name": "张三"}, {"name": "李四"} ]

不合格的json对象

{ name: "张三", 'age': 32 }  // 属性名必须使用双引号
[32, 64, 128, 0xFFF] // 不能使用十六进制值
{ "name": "张三", "age": undefined } // 不能使用undefined
{ "name": "张三",
"birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
"getName": function() {return this.name;} // 不能使用函数和日期对象
}

json支持的7种数据格式

Python JSON
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

javaScript中关于json对象和字符串转换的2种方法

JSON.parse(): 用于将一个 JSON 字符串转换为 JavaScript 对象

JSON.parse('{"name":"Q1mi"}');
JSON.parse('{name:"Q1mi"}') ; // 错误
JSON.parse('[18,undefined]') ; // 错误

JSON.stringify(): 用于将 JavaScript 值转换为 JSON 字符串。

JSON.stringify({"name":"Q1mi"})

Ajax简介

  • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

除了异步特点外,还有一个就是浏览器页面局部刷新

from django.db import models

# Create your models here.
class User(models.Model):
username=models.CharField(max_length=32)
password=models.CharField(max_length=32)

发请求给服务器的途径

1. 地址栏:get
2. form表单,支持get和post
3. 超链接 <a href="/path/">click</a> 这种是get方式
4. Ajax请求: 可以指定get和post

发Ajax请求一般返回httpResponse()

from django.shortcuts import render, HttpResponse
from app01 import models
import json
from django.http import JsonResponse def index(request):
return render(request, 'index.html') def login(request):
user = request.POST.get("user")
pwd = request.POST.get("pwd")
#根据表单的用户名和密码到数据库中匹配
user_obj = models.User.objects.filter(username=user, password=pwd).first()
print(user_obj)
#一般请求下,需要定义一个字典。msg是约定成俗的名字,用来做提示的
response = {"user":None,"msg":None}
if user_obj: # 判断有返回结果的请求下
response["user"] = user_obj.username # 修改字典的用户名
print(user_obj.username)
else:
response["msg"] = "用户名或者密码不一致" # 修改提示信息
#返回json格式数据,默认序列化时,对中文默认使用的ascii编码。
# ensure_ascii=False表示显示真正的中文
# return HttpResponse(json.dumps(response, ensure_ascii=False))
return JsonResponse(response)

前端配置文件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<style type="text/css">
input {
width: 50px;
}
</style>
</head>
<body>
{% csrf_token %}
<h4>登录验证</h4>
<form>
<lable>用户名</lable>
<input type="text" id="user">
<lable>密码</lable>
<input type="password" id="pwd">
<input type="button" value="提交" id="login_btn">
{#显示错误信息#}
<span class="error"></span>
</form>
{% csrf_token %}
<script>
$("#login_btn").click(function () {
var csrf = $("[name=csrfmiddlewaretoken]").val();
//发送ajax请求
$.ajax({
url: "/login/", //请求的url
type: "post", //默认get
data: {
user: $("#user").val(),
pwd: $("#pwd").val(),
csrfmiddlewaretoken: csrf,
},
success: function (data) { //data接收响应体,必须要有
console.log(data); //打印响应体
console.log(typeof data); //打印数据类型
{#var data = JSON.parse(data); //反序列化数据#} if (data.user) { // 登陆成功
//window.location.href表示跳转页面
alert("登录成功");
window.location.href = "/index/";
} else { // 登陆失败
//修改span标签,显示失败的返回值,并显示红色,左间距20px
$(".error").text(data.msg).css({"color": "red", "margin-left": "20px"})
//设置定时器,2秒后清空提示信息
setTimeout(function () {
$(".error").text("") //清空提示信息
}, 2000)
}
}
})
});
</script>
</body>
</html>

 文件上传

请求头 contentType

1. application/x-www-form-urlencoded

最常见的Post提交数据方式,原生的from表单,如果不设置enctype属性,那么默认就是 application/x-www-form-urlencoded

2.multipart/form-data

这又是一个常见post数据提交的方式,我们使用表单上传文件时,必须让 <form> 表单的 enctype 等于 multipart/form-data

<form action="" method="post" enctype="multipart/form-data">
</form>

3.application/json

form 提交上传文件

因为django对于文件,单独做了一个属性request.FILES

ajax和form默认都是application/x-www-form-urlencoded; 

urlencoded的数据格式是a=1&b=2这种格式

def file_put(request):
if request.method=='POST':
print(request.POST)#打印post信息
# < QueryDict: {'csrfmiddlewaretoken': ['TyrJMwNy8VTYHUjKYooMsEhce8kcS1fiKUT4nlAgEkxCgnTp1NzOtig0m1XHtLV7'],
# 'user': ['']} >
# < MultiValueDict: {'img': [ < InMemoryUploadedFile: 自定制web框架的流程.png(image / png) >]} >
print(request.FILES)#打印文件信息
file_obj=request.FILES.get("img")#获取img
print(type(file_obj))#<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
print(file_obj.__dict__)# 打印img对象属性
print(file_obj.name)#打印文件名
with open("static/img/"+file_obj.name,'wb') as f:
for line in file_obj:
f.write(line)#写入文件
return render(request,"file_put.html")#渲染file_put.html
file_put.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>form表单文件上传</h3>
<form action=""method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="text" name="user">
<input type="file" name="img">
<input type="submit">
</form>
</body>
</html>

ajax指定ContentType

请求头ContentType有3种类型,最常用的是第1,3这两种类型。

那么ajax如果要发送json,需要声明ContentType类型

index.html修改

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static "bootstrap/css/bootstrap.css" %}">
</head>
<body>
<button class="btn2">click</button>
<script src="{% static "js/jquery.js" %}"></script>
<script>
$.ajax({
url:"/ajax_handle/",//发送url
type:"post",
contentType:"json",//申明json类型
data:JSON.stringify({//序列号jison
a:1,
b:2,
}),
success:function (data) {//接收相应体
console.log(data)//打印相应体
}
})
</script>
</body>
</html>

注意:form表单不能发送json数据,只能由ajax发送!

那么application/json的数据,在哪里呢?在request.body里面!

查看Pycharm控制台输出:

<QueryDict: {}>

为什么django视图函数,接收的POST数据是空的呢?明明发过来了啊!

因为wsgi接收数据时,它会对ContentType做if判断。当ContentType为application/x-www-form-urlencoded时,并且请求方式为POST时,将数据给request.POST封装成一个字典!

那么application/json的数据,在哪里呢?在request.body里面!

views.py

def ajax_handle(request):
print(request.POST)
print(request.body)
  #由于是一个bytes类型,需要解码,再用json反序列才行
data=json.loads(request.body.decode('utf-8'))
print(data)#打印json
print(data["a"])#取key为a的值
return HttpResponse('ok')

<QueryDict: {}>
b'{"a":1,"b":2}'
{'a': 1, 'b': 2}
1

基于ajax的文件上传

利用ajax和FormData实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方法和XMLHttpRequest Level 2的FormData接口

def file_put(request):
if request.method == 'POST':
print(request.POST) # 打印post信息
print(request.FILES) # 打印文件信息
file_obj = request.FILES.get("img")
print(type(file_obj))
print(file_obj.__dict__) # 打印img对象属性
print(file_obj.name) # 打印文件名
response = {"state": False}
with open("statics/img/" + file_obj.name, 'wb') as f:
for line in file_obj:
ret = f.write(line) # 写入文件
print(ret) # 返回写入
if ret: # 判断返回值
response["state"] = True
return HttpResponse(json.dumps(response))
return render(request, "file_put.html") # 渲染file_put.html
file_put.html 文件
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static "bootstrap/css/bootstrap.css" %}">
</head>
<body>
{% csrf_token %}
<h3>form表单上传</h3>
<form action="">
用户名 <input type="text" id="user"><br>
头像 <input type="file" id="avatar"><br>
<input type="button" id="agax-sumit" value="agax-sumit">
</form>
<script src="{% static "js/jquery.js" %}"></script>
<script>
$("#agax-sumit").click(function(){
var csrf = $("[name=csrfmiddlewaretoken]").val(); //csrf
var formdata=new FormData(); //实例化了一个空的FormData对象
formdata.append("csrfmiddlewaretoken",csrf); //给当前FormData对象添加一个键/值对.
formdata.append("user",$("#user").val());
formdata.append("img",$("#avatar")[0].files[0]);
$.ajax({
url:"", //表示为当前url
type:"post",
data:formdata, //发送一个FormData对象
processData: false , // 不处理数据
contentType: false, // 不设置内容类型 success:function(data){
var data = JSON.parse(data); //反序列化数据
console.log(data);
if (data.state){ //判断返回值
//弹出提示框,并刷新整个页面
alert('上传成功');window.location.href="/file_put/";
}else {
alert('上传失败');
} }
}) })
</script>
</body>
</html>

python django初识ajax的更多相关文章

  1. python Django之Ajax

    python Django之Ajax AJAX,Asynchronous JavaScript and XML (异步的JavaScript和XML),一种创建交互式网页应用的网页开发技术方案. 异步 ...

  2. python - django 使用ajax将图片上传到服务器并渲染到前端

    一.前端代码 <!doctype html> <html lang="en"> <head> <meta charset="UT ...

  3. Django补充及初识Ajax

    Django创建一对多表结构 首先现在models.py中写如下代码: from django.db import models # Create your models here. class Bu ...

  4. Django(四) ORM 外键操作及初识Ajax

    一.内容回顾 1.Django请求的生命周期: ​ 路由系统 -> 视图函数(获取模板+数据 -> 渲染) -> 字符串返回给用户 2.路由系统: /index/ #-> 函数 ...

  5. Python自动化 【第十八篇】:JavaScript 正则表达式及Django初识

    本节内容 JavaScript 正则表达式 Django初识 正则表达式 1.定义正则表达式 /.../  用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m ...

  6. python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)

    昨日内容回顾 基于对象的跨表查询 正向查询:关联属性在A表中,所以A对象找关联B表数据,正向查询 反向查询:关联属性在A表中,所以B对象找A对象,反向查询 一对多: 按字段:xx book ----- ...

  7. Python学习笔记整理总结【Django】Ajax

     一.Ajax(part1) Ajax即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术,AJAX = ...

  8. Python之旅Day15 Bootstrap与Django初识

    Bootstrap初识 Bootstrap简介 Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目.(官网http://www.boo ...

  9. python django 多级业务树形结构规划及页面渲染

    概述: 在项目中,父级到子级结构并不少见,如果仅仅的两层树形结构,我们可以使用数据库的外键设计轻松做到,子级业务表设计一字段外键到父级业务表,这样子到父.父到子的查询都非常简单. 但是往往父子结构会有 ...

随机推荐

  1. 我认知的javascript之作用域和闭包

    说到javascript,就不得不说javascript的作用域和闭包:当然,还是那句老话,javascript在网上都说得很透彻了,我也就不过多的强调了: 作用域:javascript并没有像其他的 ...

  2. sqlmap --tamper 绕过WAF脚本分类整理

    分类: https://blog.csdn.net/whatday/article/details/54774043 详细介绍: https://blog.csdn.net/qq_34444097/a ...

  3. windows环境:idea或者eclipse指定用户名操作hadoop集群

    方法 在系统的环境变量或java JVM变量添加HADOOP_USER_NAME(具体值视情况而定). 比如:idea里面可以如下添加HADOOP_USER_NAME=hdfs 原理:直接看源码 /h ...

  4. webpack开发环境和生产环境切换原理

    在package.json中有如下设置: "scripts": {    "dev": "node build/dev-server.js" ...

  5. loc iloc函数的区别

    import pandas as pd data1 = pd.read_excel(r"G:\Python\example1.xlsx") loc 用行列标签,iloc用数字索引. ...

  6. Ubuntu 18.04安装MySQL指南

    前言 Ubuntu18.04想要安装MySQL,只能安装MySQL8.0版本.如果你直接 apt-get install mysql-server 安装,那么恭喜踩坑! 先给出彻底删除mysql5.x ...

  7. VS2017 安装Swagger初步认识

    1.安装NuGet包 2.配置 3.运行测试 参考博客:https://www.cnblogs.com/yilezhu/p/9241261.html 一 安装NuGet包 包名:Swashbuckle ...

  8. Linux内存管理 (16)内存规整

    专题:Linux内存管理专题 关键词:内存规整.页面迁移.pageblock.MIGRATE_TYPES. 内存碎片的产生:伙伴系统以页为单位进行管理,经过大量申请释放,造成大量离散且不连续的页面.这 ...

  9. Sublime 禁止自动升级

    打开SUblime   Prefreences  找到"设置-用户" 添加 "update_check":false, 即可禁用默认升级 此时完整如下 { &q ...

  10. python线程join方法

    转载:http://www.cnblogs.com/cnkai/p/7504980.html Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: ...