01-vue和api整合流程、CORS

 1、后端代码

1、项目结构

2、项目代码

主url

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include('api.urls'))
]

url

from django.urls import path, include
from api.view import course

urlpatterns = [
    path('course', course.CourseView.as_view())
]

view

from rest_framework.views import APIView
from rest_framework.response import Response


class CourseView(APIView):
    def get(self, request):
        ret = {
            'code':1000,
            'data':[
                {"id": 1, "title": "python全栈"},
                {"id": 2, "title": "Linux运维"},
                {"id": 3, "title": "金融分析"},
            ]
        }

        return Response(ret)

效果

 2、vue前端代码

 0、生成vue项目

 详见: https://www.cnblogs.com/venicid/p/11560093.html#_label1

vue init webpack  # 初始化
npm run dev    # 启动

 1、项目结构

      

 2、route-link

 3、路由: index.js 

  

 4、各个组件,数据双向绑定

 

course:v-for

 5、ajax请求:axios:aikeshesi

axios/jquery 只用来发ajax请求  aikeshesi

本质上都是 使用 XMLhttprequest对象

//axios   
npm install axios --save
第一步:在main.js中配置
第二步:使用axios发送请求

 (1)安装axios

 

 (2)在main.js设置  $axios=axios

 

(3) 发送axios请求

 6、var that = this 

此时的this不是this了

this补充

一般函数

自执行函数

题目

 6、代码Course.vue

<template>
    <div>
        <h1>{{ msg }}</h1>
        <ul v-for="row in courseList">
            <li>{{ row.title }}</li>
        </ul>
    </div>
</template>

<script>
export default {
    name:"course",
    data(){
        return {
            msg:"课程列表",
            courseList:[]
        }
    },
    mounted:function(){
        // vue页面刚加载时自动执行
        this.initCourse()
    },
    methods:{
        initCourse:function(){
            // 通过ajax向接口发送请求,并获取课程列表
            // jquery/axios

            // npm install axios --save
            //第一步:在main.js中配置
            //第二步:使用axios发送请求
            
            var that = this
            
            this.$axios.request({
                //参数
                url:"http://127.0.0.1:8001/api/v1/course",
                method:"GET"

            }).then(function(ret){
                //ajax请求发送成功后,获取响应的内容
                console.log(ret)
                if(ret.data.code == 1000){
                    that.courseList = ret.data.data
                }else{
                    alert("获取数据失败")
                }

            }).catch(function(){
                //ajax请求失败后,获取响应的内容
            })
        }
    }
}
</script>

<style  scoped>

</style>

 3、CORS跨域实现简答请求

1、问题描述

浏览器的同源策略:域名,协议,端口相同.

https://www.cnblogs.com/venicid/p/9473277.html

vue监听8080

django监听8001

端口不同也会跨域

 

随着技术的发展,现在的浏览器可以支持主动设置从而允许跨域请求,即:跨域资源共享(CORS,Cross-Origin Resource Sharing),其本质是设置响应头,使得浏览器允许跨域请求。

 

 

2、参考blog

wupeiqi :  https://www.cnblogs.com/wupeiqi/article/5703697.html

3、添加响应头

中间件,响应的时候加个响应头

 

 

4、代码cors

from django.middleware.clickjacking import XFrameOptionsMiddleware

class MiddlewareMixin:
    def __init__(self, get_response=None):
        self.get_response = get_response
        super().__init__()

    def __call__(self, request):
        response = None
        if hasattr(self, 'process_request'):
            response = self.process_request(request)
        response = response or self.get_response(request)
        if hasattr(self, 'process_response'):
            response = self.process_response(request, response)
        return response


class CORSMiddleware(MiddlewareMixin):

    def process_response(self,request,response):
        # 添加响应头
        # response['XXXXX'] = 8888

        # 1.允许你的域名来获取我的数据
        # response['Access-Control-Allow-Origin'] = "http://localhost:8080"
        response['Access-Control-Allow-Origin'] = "*"

        # 2.允许你携带Content-Type请求头
        response['Access-Control-Allow-Headers'] = "Content-Type,Host,XXX"

        # 3.允许你发送DELETE,PUT
        response['Access-Control-Allow-Methods'] = "DELETE,PUT"

        return response

 效果图

 

 

3、总结与作业

1、作业

 

2、总结

 

posted @ 2019-09-27 21:46  venicid  阅读(687)  评论(0编辑  收藏  举报