本篇介绍ajax的概念与用法。
通过这篇文章,你能了解到:
- ajax是什么?
- 传输数据的json
- ajax的两个例子(注册与文件上传)
铺垫
JSON
什么是 JSON ?
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
JSON 是轻量级的文本数据交换格式
JSON 独立于语言
JSON 具有自我描述性,更易理解
序列化与反序列化是实现方式
下图为python与JavaScript的数据交换。
ajax
回顾之前用到的请求:
- 浏览器地址栏输入 get请求
- a标签 get请求
- form表单 get/post
它们都是返回一个完整的页面,我们的请求也是同步的。
例子1
- 在注册页面,当我们输入用户名,input框失去焦点的时候,对用户名进行判断是否在数据库中重复。如果重复提示用户名重复,不存在提示可以使用
1 | # views.py |
在 return 返回的时候
render:返回整个页面 (span标签中也将填充这个页面的代码)
redirect 去重定向的地址找东西,然后将这个地址的内容返回;如果想让前端跳转的话可以设置
locaiton.href = res
1 | # register.html |
- 结果返回 Forbidden (CSRF token missing or incorrect.): /register/userval
- 对于ajax提交的POST请求,我们需要通过csrf校验。
ajax通过django的csrf校验的方式
网页中渲染
1
{% csrf_token %}
方式一
- 将这个
csrfmiddlewaretoken
对应的值添加到data
中
1 | <script> |
方式二
- 将这个
csrfmiddlewaretoken
对应的值添加到headers
的x-csrftoken
键对应的值中。 - note: 这里是headers不是header哦!!!
1 | <script> |
在这里可能会有个疑问,这个Cookie中的csrftoken值是什么时候有的呢?
当我们不设置 {% csrf_token %} 的时候,请求与响应中是没有的。
当我们的页面中有 {% csrf_token %} 的时候,在我们发GET请求的时候,响应头中有一个
Set-Cookie: csrftoken=T30RX7O0E...
。用源码解释:
- 这段代码的重点在于对CSRF_COOKIE_USED的检查,如果没有设置,middleware会直接返回response而不在cookie里设置csrftoken。
1 | # django/middleware/csrf.py |
例子2
使用ajax上传文件
- 从post请求中可以拿出filename这个键值对
- 从request.FILES 可以拿出这个文件
1 | # views.py |
- 对于file文件,我们可以创建一个FormData对象(字典),来存放键值对,这个对象的好处是会帮你在headers中加 Content-Type: multipart/form-data;
- 我们还需要加入两个信息:processData:false, contentType:false,来告诉js维持原状,不进行处理。
1 |
|
note: FormData 只能用post发送,get不行。
例子3:
Ajax与modelform配合使用:
- 再modelform中需要重写
__init__
方法来为显示的标签添加 bootstrap 样式。 - 使用 JsonResponse 来进行回复。
1 | # views.py |
页面中:
serialize()
方法通过序列化表单值,创建 URL 编码文本字符串。然后将这个拼接到 url 的后面即可。
1 | <!--模态框内容 --> |