博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python django初识ajax
阅读量:5235 次
发布时间:2019-06-14

本文共 5226 字,大约阅读时间需要 17 分钟。

什么是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, HttpResponsefrom app01 import modelsimport jsonfrom django.http import JsonResponsedef 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)

 前端配置文件

    
Title {% csrf_token %}

登录验证

用户名
密码
{#显示错误信息#}
{% csrf_token %}

 文件上传

请求头 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

 

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))#
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
    
Title

form表单文件上传

{% csrf_token %}

ajax指定ContentType

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

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

index.html修改

{% load static %}    
Title

注意: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 %}    
Title
{% csrf_token %}

form表单上传

用户名
头像

 

转载于:https://www.cnblogs.com/zaizai1573/p/10480352.html

你可能感兴趣的文章
Android控件之GridView探究
查看>>
在工程中要加入新的错误弹出方法
查看>>
PS 滤镜— — sparkle 效果
查看>>
snmpwalk命令常用方法总结
查看>>
网站产品设计
查看>>
TCP/IP协议
查看>>
如何修改被编译后DLL文件 (转发)
查看>>
C++按格式接收输入字符(京东,滴滴,360笔试必用)
查看>>
代理ARP
查看>>
go 学习笔记(4) ---项目结构
查看>>
分割线细线
查看>>
java 中的一些运算符问题
查看>>
css切换--使用cookie
查看>>
java中静态代码块的用法 static用法详解
查看>>
Java线程面试题
查看>>
Paper Reading: Relation Networks for Object Detection
查看>>
Android中点中overlay弹出带尾巴的气泡的实现
查看>>
Mybatis接口中传递多个参数
查看>>
Dreamweaver层使用八定律
查看>>
Java IO流学习总结
查看>>