zoukankan      html  css  js  c++  java
  • DAY104

    一、CORS跨域资源共享

    1.什么是CORS跨域资源共享

    ​ 为了解决跨域问题,就需要CORS。

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

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

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

    ​ 跨域问题源于浏览器的一项安全策略,同源策略。当前的域的请求只允许朝当前域的网页发请求,如果向其他域发请求,请求可以正常发送,也会携带数据回来,但是浏览器会拦截数据。

    ​ 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同。

    ​ 比如:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据。

    ​ 浏览器上就会报错,个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险。

    2.CORS具体使用

    浏览器将CORS请求分成两类:

    • 简单请求(simple request)

      ​ 浏览器发出CORS简单请求只需要在头信息之中增加一个Origin字段。

    • 非简单请求(not-so-simple request)。

      ​ 浏览器发出CORS非简单请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。

      ​ 浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

    简单请求和非简单请求的区别?

    # 1.满足条件不用
    # 简单请求的满足条件
    (1) 请求方法是以下三种方法之一:
    HEAD
    GET
    POST
    (2)HTTP的头信息不超出以下几种字段:
    Accept
    Accept-Language
    Content-Language
    Last-Event-ID
    Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
    
    # 也就是说,必须满足以上条件才行,如果POST请求但是JSON格式,就不是简单请求
    
    # 凡是不同时满足上面两个条件,就属于非简单请求。
    
    # 2.请求次数
    简单请求:一次请求
    非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。
    
    # 关于“预检”
    	请求方式:OPTIONS
    	“预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
        
    

    3.Django中CORS的使用

    # 对单个视图的使用
    class Course(APIView):
        def get(self, request):
            ret = Response('course')
            # 简单请求
            # '*'或'指定域名'
            ret['Access-Control-Allow-Origin'] = '*'
    
            # 非简单请求
            if request.method == "OPTIONS":
                #  '*'或'Content-Type'
                ret['Access-Control-Allow-Headers'] = '*'
            return ret
        
    # 全局使用
    # 放入中间件
    from django.utils.deprecation import MiddlewareMixin
    
    
    class Mymiddle1(MiddlewareMixin):
        def process_response(self, request, response):
            # 简单请求
            # '*'或'指定域名'
            response['Access-Control-Allow-Origin'] = '*'
            # 非简单请求
            if request.method == "OPTIONS":
                #  '*'或'Content-Type'
                response['Access-Control-Allow-Headers'] = '*'
            return response  
    

    二、pycharm开发vue项目

    1.安装VUE

    1. 安装node.js
    2. 安装vue脚手架
    3. cmd命令:vue create 项目名

    2.pycharm配置vue项目

    • 安装vue.js插件

      setting--->plugins--->左下方install---->搜索vue.js---->下载--->重启pycharm

    • 运行vue项目

      editconfigration--->+--->npm--->Scripts:serve

    3.VUE项目结构

    项目名
    |---> node_modules:项目依赖(以后项目要传到git上,这个不能传)
    |---> publish
    |	  |---> index.html  是总页面
    |--- src :项目
    |	  |---> assets:静态资源
    |	  |---> components:视图组件中所需的小组件
    |	  |---> views:视图组件
    |	  |---> APP.vue:根组件,通过路由连接到视图组件
    |	  |---> main.js:总的入口js
    |	  |---> router.js:路由相关,所有路由的配置,在这里面
    |	  |---> store.js:vuex状态管理器
    |---> package.json:项目的依赖,npm install 是根据它来安装依赖的
    

    4.组件的格式

    <template>
    	html标签
    </template>
    <style>
        css语法
    </style>
    <script>
    	js语法
    </script>
    

    5.使用组件的路由配置

    <!-- App.vue -->
    <!-- to="路由中配置路径" -->
    <router-link to="/course">课程</router-link>
    
    // router.js
    import Vue from 'vue'
    import Router from 'vue-router'
    import Home from './views/Home.vue'
    // 1.导入视图组件
    import Course from './views/Course.vue'
    
    Vue.use(Router)
    
    export default new Router({
      mode: 'history',
      base: process.env.BASE_URL,
      routes: [
        {
          path: '/',
          name: 'home',
          component: Home
        },
    // 2.配置路由
        {
          path: '/course',
          name: 'course',
          // 方式一:直接导入
          // component: () => import('./views/Course.vue')
          // 方式二:导入后,再使用
          component:Course
        }
      ]
    })
    

    6.组件的数据与方法

    <template>
        <div class="course">
            <h1>{{ msg }}</h1>
            <button @click="test">test</button>
        </div>
    </template>
    
    <script>
        export default {
            data: function () {
                return {
                    msg: 'course',
                }
            },
            methods: {
                test() {
                    alert('test')
                },
            },
        }
    
    </script>
    

    7.组件的axios(ajax)

    • 安装axios

      npm install axios

    • 使用

      VUE

      # main.js
      import axios from 'axios'
      # 为了能全局使用axios
      # 把axios配置到全局变量中
      Vue.prototype.$http=axios
      # 把路径也放入全局变量
      Vue.prototype.$url ='http://127.0.0.1:8000'
      
      <template>
          <div class="course">
              <h1>{{ msg }}</h1>
              {{course}}
              <p v-for="c in course">
                  {{c}}
              </p>
      
              <button @click="test">test</button>
          </div>
      </template>
      
      <script>
          export default {
              data: function () {
                  return {
                      msg: 'course',
                      course: ['python', 'linux']
                  }
              },
              methods: {
                  test: function () {
                      // this指向VUE
                      let _this = this;
                      this.$http.request({
                          url: _this.$url + '/course/',
                          method: 'get'
                      }).then(function (response) {
                          // then:成功时的回调函数
                          // 指向性的函数里的this指的是当前的函数,与上面的this不同
                          console.log(response.data)
                      }).catch(function (response) {
                          // catch:失败时的回调函数
                          console.log(response.data)
                      })
                  }
              }
          }
      </script>
      

      DJANGO

      class Course(APIView):
          def get(self, request):
              return Response(['python', 'linux'])
      
      

  • 相关阅读:
    Python垃圾回收机制 总结
    求二叉树中任意两个结点的距离
    Python 实现排序算法
    InnoDB 索引原理
    Linux常用脚本命令总结
    How Django works?
    RabbitMQ 知识总结
    最短路径之Dijkstra算法和Floyd-Warshall算法
    最小生成树之Prim算法和Kruskal算法
    Python collections模块总结
  • 原文地址:https://www.cnblogs.com/xvchengqi/p/10158549.html
Copyright © 2011-2022 走看看