七、Ajax请求

客户端(浏览器)向服务端发起请求的形式:

  1. 地址栏:GET
  2. 超链接标签:GET
  3. form表单:GET或POST
  4. Ajax(重要):GET或POST或PUT或DELETE

AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。

AJAX的特点和优点:

  • 异步
  • 局部刷新

应用:

7.2、json数据

  1. '''
  2. Supports the following objects and types by default:
  3. +-------------------+---------------+
  4. | Python | JSON |
  5. +===================+===============+
  6. | dict | object |
  7. +-------------------+---------------+
  8. | list, tuple | array |
  9. +-------------------+---------------+
  10. | str | string |
  11. +-------------------+---------------+
  12. | int, float | number |
  13. +-------------------+---------------+
  14. | True | true |
  15. +-------------------+---------------+
  16. | False | false |
  17. +-------------------+---------------+
  18. | None | null |
  19. +-------------------+---------------+
  20. '''

(1)python的序列化和反序列化方法

  1. import json
  2. dic = {"name": "summer"}
  3. dic_json = json.dumps(dic)
  4. dic = json.dumps(dic_json)

(2)Django支持的序列化方法

关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。

  1. # 序列化响应类
  2. from django.http import JsonResponse
  3. JsonResponse({})
  4. # 序列化queryset
  5. from django.core import serializers
  6. ret = models.Book.objects.all()
  7. data = serializers.serialize("json", ret)

(1) 视图

  1. # Create your views here.
  2. def reg(request):
  3. return render(request, "reg.html")
  4. def reg_user(request):
  5. data = {"msg": "", "state": "success"}
  6. user = request.POST.get("user")
  7. if user == "summer":
  8. data["state"] = "error"
  9. data["msg"] = "该用户已存在!"
  10. return JsonResponse(data)

(2) 模板:reg.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <p>用户名:<input type="text"><span class="error" style="color: red"></span></p>
  9. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
  10. <script>
  11. $(":text").blur(function () {
  12. // 发送Ajax请求
  13. $.ajax({
  14. url: "http://127.0.0.1:8008/reg_user/",
  15. type: "post",
  16. data: {
  17. user: $(":text").val(),
  18. },
  19. success: function (response) {
  20. console.log(response);
  21. $(".error").html(response.msg);
  22. }
  23. })
  24. })
  25. </script>
  26. </body>
  27. </html>

(3) 流程图

7.4、同源策略

7.4.1、同源策略和跨域

现在我们将reg.html单独放在客户端,用浏览器打开,再触发事件,会发现报错:

这是因为浏览器的同源策略导致的。

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。

那么如何解决这种跨域问题呢,我们主要由三个思路:

  1. jsonp
  2. cors
  3. 前端代理

这里主要给大家介绍第二个:cors

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

所以,服务器方面只要添加一个响应头,同意跨域请求,浏览器也就不再拦截:

  1. response = JsonResponse(data)
  2. response["Access-Control-Allow-Origin"] = "*"

7.4.2、cors

cors有两种请求:简单请求和非简单请求

只要同时满足以下两大条件,就属于简单的请求

  1. 1) 请求方法是以下三种方法之一:
  2. HEAD
  3. GET
  4. POST
  5. 2HTTP的头信息不超出以下几种字段:
  6. Accept
  7. Accept-Language
  8. Content-Language
  9. Last-Event-ID
  10. Content-Type:只限于三个值application/x-www-form-urlencodedmultipart/form-datatext/plain

凡是不同时满足上面两个条件,就属于非简单请求。浏览器对这两种请求的处理,是不一样的。

简单请求:一次请求

非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。

  1. - 请求方式:OPTIONS
  2. - “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
  3. - 如何“预检”
  4. => 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
  5. Access-Control-Request-Method
  6. => 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
  7. Access-Control-Request-Headers

支持跨域,简单请求:

  1. 服务器设置响应头:Access-Control-Allow-Origin = '域名' '*'

支持跨域复杂请求:

  1. 由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。
  2. “预检”请求时,允许请求方式则需服务器设置响应头:Access-Control-Request-Method
  3. “预检”请求时,允许请求头则需服务器设置响应头:Access-Control-Request-Headers

cors在Django中的实现:

在返回结果中加入允许信息(简单请求):

  1. from django.utils.deprecation import MiddlewareMixin
  2. class MyCorsMiddle(MiddlewareMixin):
  3. def process_response(self, request, response):
  4. # 简单请求:
  5. # 允许http://127.0.0.1:8001域向我发请求
  6. # ret['Access-Control-Allow-Origin']='http://127.0.0.1:8001'
  7. # 允许所有人向我发请求
  8. response['Access-Control-Allow-Origin'] = '*'
  9. if request.method == 'OPTIONS':
  10. # 所有的头信息都允许
  11. response['Access-Control-Allow-Headers'] = '*'
  12. return response

在settings中配置即可,在中间件中的位置可以随意放置.

也可以通过第三方组件:pip install django-cors-headers

  1. # (1)
  2. pip install django-cors-headers
  3. # (2)
  4. INSTALLED_APPS = (
  5. 'corsheaders',
  6. )
  7. # (3)
  8. 1 MIDDLEWARE = [
  9. 2 'django.middleware.security.SecurityMiddleware',
  10. 3 'django.contrib.sessions.middleware.SessionMiddleware',
  11. 4 'django.middleware.csrf.CsrfViewMiddleware',
  12. 5 'django.contrib.auth.middleware.AuthenticationMiddleware',
  13. 6 'django.contrib.messages.middleware.MessageMiddleware',
  14. 7 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  15. 8 'corsheaders.middleware.CorsMiddleware', # 按顺序
  16. 9 'django.middleware.common.CommonMiddleware', # 按顺序
  17. 10 ]
  18. # 配置白名单
  19. 1 CORS_ALLOW_CREDENTIALS = True#允许携带cookie
  20. 2 CORS_ORIGIN_ALLOW_ALL = True
  21. 3 CORS_ORIGIN_WHITELIST = ( '*')#跨域增加忽略
  22. 4 CORS_ALLOW_METHODS = ( 'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'VIEW', )
  23. 5 #允许的请求头
  24. 6 CORS_ALLOW_HEADERS = (
  25. 7 'XMLHttpRequest',
  26. 8 'X_FILENAME',
  27. 9 'accept-encoding',
  28. 10 'authorization',
  29. 11 'content-type',
  30. 12 'dnt',
  31. 13 'origin',
  32. 14 'user-agent',
  33. 15 'x-csrftoken',
  34. 16 'x-requested-with',
  35. 17 'Pragma',
  36. 18 )

前端项目设置请求头记得添加到CORS_ALLOW_HEADERS

七、Ajax请求的更多相关文章

  1. {Django基础七之Ajax} 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解)

    Django基础七之Ajax 本节目录 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解) 一 Ajax简介 ...

  2. 【React自制全家桶】七、React实现ajax请求以及本地数据mock

    一.下载axios插件 yarn add axios 二.React的ajax请求代码如何放置 建议放置在生命周期函数之componentDidMount()中 三.ajax之get请求 axios. ...

  3. {Django基础七之Ajax} 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解)

    {Django基础七之Ajax} 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解)   Django基础七之 ...

  4. Vue(七)发送Ajax请求

    发送AJAX请求 1. 简介 vue本身不支持发送AJAX请求,需要使用vue-resource.axios等插件实现 axios是一个基于Promise的HTTP请求客户端,用来发送请求,也是vue ...

  5. python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)

    python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...

  6. Ajax请求内嵌套Ajax请求的方法

    前段时间做项目,需要把全国省市的两个XML文件整合成一个JSON格式的数据,手写的话觉得数据太多了,而且容易出错,于是就想到了用Ajax嵌套的方法来解决,就想平时用Ajax的方法直接嵌套,都会先读出外 ...

  7. 省市区联动,非ajax请求。

    需求 不允许用 ajax 请求的方式加载数据,所以把所有的省市区写在数组里,用js动态加载. 数据源 民政部门户网站:http://www.mca.gov.cn/article/sj/xzqh/201 ...

  8. 前台返回json数据的常用方式+常用的AJAX请求后台数据方式

    我个人开发常用的如下所示: 之所以像下面这样下,一是前台Ajax,二是为安卓提供接口数据 现在常用的是返回JSON数据,XML的时代一去不复返 JSON相对于XML要轻量级的多 对JSON不是十分熟悉 ...

  9. 使用ajax请求后返回数据显示undefinded解决办法

    今天在使用七牛的sdk做断点续传时候,当文件过大,本地没有存储时候,想要通过ajax将本地信息存到服务器缓存,之后通过读取缓存的方式来完成文件过大断点续传无法使用问题. 但是在使用ajax请求的时候, ...

随机推荐

  1. django中视图函数的FBV和CBV

    1.什么是FBV和CBV FBV是指视图函数以普通函数的形式:CBV是指视图函数以类的方式. 2.普通FBV形式 def index(request): return HttpResponse('in ...

  2. python与pycharm的安装与“试用”

    python与pycharm的安装与"试用" 一.python解释器安装与启动 python解释器的安装 1.打开文件安装包运行页面 #python3.8 2.选择Customiz ...

  3. 从零开始Blazor Server(13)--消息通知

    我们现在做了用户管理.角色管理.菜单管理. 但是大家有没有发现,我们的菜单要变化的话必须要刷新页面才行.这个体验感觉不太好. 今天我们就用全局通知组件来解决这个问题. 首先我们要改造以下我们的Main ...

  4. 技术管理进阶——技术Leader需要数据思维

    原创不易,求分享.求一键三连 假设我长得很漂亮,拥有众多追求者,但是初出闺房的我对这世界上的男人毫无认知,那么该如何选择呢?这真是一个问题! 妈妈说,愿意为我花钱的男人未必爱我,但不愿意为我花钱的男人 ...

  5. Ubuntu20.04配置 ES7.17.0集群

    Ubuntu20.04配置 ES7.17.0集群 ES能做什么? elasticsearch简写es,es是一个高扩展.开源的全文检索和分析引擎,它可以准实时地快速存储.搜索.分析海量的数据. Ubu ...

  6. KFS replicator安装(KES-KES)

    源端 一.安装前置配置 1.创建安装用户 groupadd flysync useradd flysync -g flysync -G kingbase passwd flysync 2.上传安装文件 ...

  7. 群晖-使用docker套件部署Prometheus+Grafana

    Docker 部署 Prometheus 说明: 先在群辉管理界面安装好docker套件,修改一下镜像源(更快一点) 所需容器如下 Prometheus Server(普罗米修斯监控主服务器 ) No ...

  8. Gitea 1.17.2 | 带来视觉提升、完善资源校验、加强安全性等42项优化

    Gitea 1.17.2 合并了 42 个 Pull Request,现已正式发布,我们建议所有用户升级到此版本.您可以到阅读原文了解更详细的介绍. 致谢:@zeripath 为 Gitea 贡献了诸 ...

  9. 从零打造“乞丐版” React(一)——从命令式编程到声明式编程

    这个系列的目的是通过使用 JS 实现"乞丐版"的 React,让读者了解 React 的基本工作原理,体会 React 带来的构建应用的优势 1 HTML 构建静态页面 使用 HT ...

  10. 记录一下对jdk8后的接口的一些理解

    对于jdk8后的接口,接口中加入了可以定义默认方法和静态方法. 为什么要这样设计呢? 是为了在给接口扩展方法的时候,不会影响已经实现了该接口的类 加入默认方法可以解决:在添加方法的同时,不影响现有的实 ...