跨域
  • 跨域是什么?

    浏览器从一个域名的网页去请求另一个域名的资源的时候,如果不同源、请求的响应结果就会被浏览器的同源策略所拦截
  • 同源策略是什么?

    同源:协议 + 域名 + 端口

    特点:阻止ajax请求、不阻止src请求

    所以不同源就会被拦截
  • 解决方式
    • JSONP

      • 新建项目CORS
      # urls.py
      
      from django.contrib import admin
      from django.urls import path
      from app01 import views urlpatterns = [
      path('admin/', admin.site.urls),
      path('index/',views.index),
      path('service/',views.CORSView.as_view()),
      ] # views.py
      from django.shortcuts import render, HttpResponse
      from django.views import View def index(request):
      return render(request,'index.html') class CORSView(View): def get(self,request):
      return HttpResponse('get--ok')
      • 新建html文件,写js,发送请求

      • 单独运行html文件和在走index视图再发生请求,会有两个结果,一个被拦截。一个没拦截。



      • 怎么解决呢?可以根据src请求不拦截的特点。在点击获取服务器数据的按钮的时候生成一个script标签,属性src就是我们要请求的url,可以携带一个回调函数过去。服务器返回数据之后执行回调函数。获取之后再删除script标签。



    • CORS添加响应头

      • 先了解两个概念:简单请求和复杂请求

        • 简单请求:

          1. HTTP方法(之一):HEAD, GET,POST
          2. HTTP头信息(不得超出):Accept, Accept-Language, Content-Language, Last-Event-ID
          3. Content-Type(之一):application/x-www-from-urlencoded multipart/form-data text/plain
        • 复杂请求:
          1. 先发送预检请求 OPTIONS
      • 这个比jsonp简单多了。只要我们后端写个中间件。允许通过的域名和方法即可
      # views.py
      from django.shortcuts import render, HttpResponse
      from django.views import View
      from django.views.decorators.csrf import csrf_exempt
      from django.utils.decorators import method_decorator def index(request):
      return render(request, 'index.html') @method_decorator(csrf_exempt, name='dispatch')
      class CORSView(View): def get(self, request):
      # func = request.GET.get('callback')
      # print(func)
      # data = 'get--ok'
      # return HttpResponse("%s('%s')" % (func, data)) return HttpResponse('get--ok') def post(self, request):
      return HttpResponse('post--ok') def put(self, request):
      return HttpResponse('put--ok') # app01\middlewares\cors.py from django.utils.deprecation import MiddlewareMixin
      class MyCors(MiddlewareMixin):
      """
      跨域中间件
      """
      def process_response(self, request, response):
      response['Access-Control-Allow-Origin'] = '*'
      # 如果是简单请求这样即可,但是我们一般方送json格式的数据,还有可能会有其他method,所有还要进一步判断
      if request.method == 'OPTIONS':
      # 复杂请求会先发预检
      response["Access-Control-Allow-Headers"] = "Content-Type"
      response["Access-Control-Allow-Methods"] = "PUT,PATCH,DELETE"
      return response
      • 单独打开我们的html文件发送ajax请求。get、post、put都可以获取数据



017---Django的中间件解决跨域的更多相关文章

  1. django框架进阶-解决跨域问题

    ####################################### """ 一.为什么会有跨域问题? 是因为浏览器的同源策略是对ajax请求进行阻拦了,但是不 ...

  2. django框架如何解决跨域问题

    跨域问题的由来 由于浏览器具有同源策略的限制. 限制:在发送Ajax请求时,如果当前浏览器的URL是a.com,页面中向b.com发送Ajax请求,请求可以正常访问,但数据回到浏览器时,浏览器会阻止. ...

  3. Django后端彻底解决跨域问题

    最近在接一个前后端分离的项目,后端使用的django-restframework,前端使用的Vue.后端跑起来后,发现前端在访问后端API时出了了跨域的问题. 类似如下报错: 关于跨域问题,之前这篇文 ...

  4. [django]django配合前端vue前后端联调,django服务端解决跨域(django-cors-headers)

    django内部csrf post提交数据解决 https://www.cnblogs.com/iiiiiher/articles/9164940.html 前端写了个页面,里面$.post发现403 ...

  5. django之csrf_exempt解决跨域请求的问题

    一: from django.views.decorators.csrf import csrf_exempt # 获取微信返回的code信息 @csrf_exempt def wechat_auth ...

  6. gin框架中间件解决跨域问题

    http://www.niu12.com/article/45// 初始化routerrouter := gin.New() router.Use(gin.Logger()) router.Use(g ...

  7. Django使用cors解决跨域问题

    1.安装Django-cors-headers模块 pip install django-cors-headers 2.配置settings.py文件 INSTALLED_APPS = [ ... ' ...

  8. 在django中解决跨域AJAX

    由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取另一个源加载的文档的属性. 特别的:由于同源策略是浏览器的限制,所以请求的发送和响应是可以进行,只不过浏览器不接收罢了. 浏览器同源 ...

  9. 关于跨域介绍和djiago解决跨域问题

    什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 什么是同源策略? 同源策略又分为以下两种 DOM同源策略:禁止对不 ...

随机推荐

  1. 深入JDK源码,这里总有你不知道的知识点!

    Java的基础知识有很多,但是我认为最基础的知识应该要属jdk的基础代码,jdk的基础代码里面,有分了很多基础模块,其中又属jdk包下面的lang包最为基础. 我们下面将总结和分析一下lang包下面最 ...

  2. dedecms 去掉栏目页的预览功能

    首先找到include/typeunit.class.admin.php 再找到 ListAllType 方法,该方法的功能是“读出所有分类” 找到并将该方法内的所以以下代码注释或者删除”<a ...

  3. 增强for循环 java.util.ConcurrentModificationException

    Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator.第一次调用Iterator的next()方法时,它返回序列的第一个元 ...

  4. 一个查看UI5控件所有公有方法的小技巧

    一个很小的tip:比如我想把UI5表格控件里的每列设置成宽度根据显示的内容自适应,需要知道应该调用控件的哪个方法来实现. 一种办法当然是查SAP帮助文档,得知需要调用控件的公有方法setAutoSiz ...

  5. 动态规划(DP),压缩状态,插入字符构成回文字符串

    题目链接:http://poj.org/problem?id=1159 解题报告: 1.LCS的状态转移方程为 if(str[i-1]==str[j-1]) dp[i][j]=dp[i-1][j-1] ...

  6. 【洛谷P1169】[ZJOI2007]棋盘制作

    棋盘制作 题目链接 这个题是[USACO5.3]巨大的牛棚Big Barn和玉蟾宫的结合 一道顶两道毒瘤! 题解: 首先,棋盘有两种选法: 1.任意白格(x,y) (x+y)%2=0 ,任意黑格(x, ...

  7. Android学习笔记_28_手势识别

    一.准备手势库: 使用SDK自带例子GestureBuilder建立手势库(位置:android-sdk-windows\samples\android-10\GestureBuilder).使用Ge ...

  8. 【题解】洛谷P2926 [USACO08DEC]拍头Patting Heads

    洛谷P2926:https://www.luogu.org/problemnew/show/P2926 思路 对于每一个出现的数 从1到Max 凡是这个数的倍数 那么ans就加上他的个数 PS:最后要 ...

  9. Storm 出现 no jzmq in java.library.path

    在真实环境中运行时,在log日志下,查看workpid日志发现出现该错误. 解决办法: 在conf/storm.yaml添加jzmq安装的路径, 我使用的默认安装在/usr/local/lib下 ja ...

  10. laravel5项目安装debugbar

    链接:https://github.com/barryvdh/laravel-debugbar 1.项目目录运行 composer require barryvdh/laravel-debugbar ...