• vue前后台交互


    1. 前后端使用相同的协议
    2. 接口协议

    axios

    配置axios来完成前后台ajax请求

    安装 axios(ajax)的命令
    cnpm install axios
    // 为项目配置全局axios,配置环境
    import Axios from 'axios'
    //Vue.prototype.$ajax = Axios;//命名方式1
    Vue.prototype.$axios = Axios;//命名方式2,vue框架常使用
    
     export default {
            name: "Cars",
            components: {
                Car
            },
            data() {
                return {
                    cars_data: []
                }
            },
            created() {
                // 组件一加载,就从后台请求数据
    
                // 1、jq完成ajax请求,一般不使用
                /*
                $.ajax({
                    url: this.$settings.base_url + '/cars/',
                    type: 'get',
                    success(response) {
                        console.log(response)
                    }
                });
                */
    
               
            }
        }
    

    使用

     export default {
            name: "Cars",
            components: {
                Car
            },
            data() {
                return {
                    cars_data: []
                }
            },
            created() {
    // 2、vue有专门用来完成ajax请求的插件:axios
                this.$ajax({
                    url: this.$settings.base_url + '/cars/',
                    method: 'get',
                    params: {
                        // url拼接的数据
                    },
                    data: {
                        // 请求携带的数据报数据
                    }
                }).then((response) => {//成功
                    console.log(response);
                    this.cars_data = response.data;
                }).catch(error => {//失败
                    console.log(error)
                })
    
    
    
    let _this = this
    this.$ajax({
        method: 'post',
        url: 'http://127.0.0.1:5000/loginAction',
        params: {
            usr: this.usr,
            ps: this.ps
        }
    }).then(function(res) {
        // this代表的是回调then这个方法的调用者(axios插件),也就是发生了this的重指向
        // 要更新页面的title变量,title属于vue实例
        // res为回调的对象,该对象的data属性就是后台返回的数据
        _this.title = res.data
    }).catch(function(err) {
        window.console.log(err)
    })
    
    # 用pycharm启动该文件模拟后台
    from flask import Flask, request, render_template
    from flask_cors import CORS
    app = Flask(__name__)
    CORS(app, supports_credentials=True)
    
    @app.route('/')
    def index():
        return "<h1>主页</h1>"
    
    @app.route('/loginAction', methods=['GET', 'POST'])
    def test_action():
        # print(request.args)
        # print(request.form)
        # print(request.values)
        usr = request.args['usr']
        ps = request.args['ps']
        if usr != 'abc' or ps != '123':
            return 'login failed'
        return 'login success'
    
    
    if __name__ == '__main__':
        app.run()
    

    django后台处理跨域(cors)问题

    安装插件

    在diango环境下安装

    >: pip install django-cors-headers
    
    插件参考地址:https://github.com/ottoyiu/django-cors-headers/
    

    项目配置:settings.py

    # 注册app
    INSTALLED_APPS = [
    	...
    	'corsheaders'
    ]
    
    # 添加中间件
    MIDDLEWARE = [
    	...
    	'corsheaders.middleware.CorsMiddleware'
    ]
    
    # 允许跨域源
    CORS_ORIGIN_ALLOW_ALL = True
    

    配置完成后可以进行交互

    后端返回数据的时候需要注意

    一般返回JsonResponse数据类型

    from django.http import JsonResponse

    注意:JsonResponse返回的是字典类型,如果是其他的可迭代类型,选择用下面的形式返回

        cars_data = [
            {
                'name': '玛莎拉蒂',
                'price': 12.5
            },
            {
                'name': '劳斯莱斯',
                'price': 32
            }
        ]
    return JsonResponse(data=cars_data, safe=False, json_dumps_params={'ensure_ascii': False})
    

    中间件问题

    前后端分离后csrf这个中间件便不会被使用,所以需要进行注释

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'corsheaders.middleware.CorsMiddleware',
    ]
    

    登陆的前后端分离

    django后端

    def login(request, *args, **kwargs):
        if request.method == 'GET':
            print(request.GET)
            print(request.POST)
            print(request.body)
        elif  request.method == 'POST':
            print(request.GET)
            print(request.POST)
            print(request.body)
            # usr必须是Bob,pwd必须是123
            import json
            dic = json.loads(request.body)
            usr = dic.get('usr')
            pwd = dic.get('pwd')
            if usr == 'Bob' and pwd == '123':
                return JsonResponse({
                    'msg': '登录成功',
                    'result': 'bob.123.xyz',
                })
            return JsonResponse({
                'msg': '登录失败',
                'result': ''
            })
    

    vue前端

    <template>
        <div class="login">
            <el-row>
                <el-col :span="12" :offset="6">
                    <el-form ref="form" :model="form" label-width="80px">
                        <el-form-item label="账号">
                            <el-input type="text" v-model="form.usr"></el-input>
                        </el-form-item>
                        <el-form-item label="密码">
                            <el-input type="password" v-model="form.pwd"></el-input>
                        </el-form-item>
                        <el-form-item>
                            <el-button type="primary" @click="onSubmit">登录</el-button>
                        </el-form-item>
                    </el-form>
                </el-col>
            </el-row>
        </div>
    </template>
    
    <script>
        export default {
            name: "Login",
            data() {
                return {
                    form: {
                        usr: '',
                        pwd: ''
                    }
                }
            },
            methods: {
                onSubmit() {
                    if (!this.form) {
                        return;
                    }
    
                    this.$ajax({
                        url: this.$settings.base_url + '/login/',
                        method: 'post',
                        params: {  // url拼接参数
                            p1: '123'
                        },
                        // data: {  // 数据包参数
                        //     d1: 'xyz'
                        // }
                        data: this.form
                    }).then(response => {
                        this.$message({
                            message: response.data.msg,
                            type: 'warning'
                        });
    
                        // 有响应的登录认证码,存储在cookie中
                        // 设置:set(key, val, exp)
                        // 取值:get(key)
                        // 删除:remove(key)
                        let token =  response.data.result;
                        if (token) {
                            // this.$cookies.set('token', token, '2d');
                            // this.$cookies.set('token', token, 2 * 24 * 3600 * 365);
                            // console.log(this.$cookies.get('token'));
                            // this.$cookies.remove('token');
                        }
                    })
                }
            }
        }
    </script>
    
    <style scoped>
        .el-form {
            height: 296px;
            border: 2px solid darkcyan;
            border-radius: 10px;
            margin: calc(50vh - 200px) 0;
            padding: 30px;
        }
    </style>
    
  • 相关阅读:
    ultraEdit使用utf8乱码的解决办法
    利用替换字符串的函数StringReplace删除字符串中指定的字符或字符串
    COBID,CanID,NodeID的不同
    随机生成一个10位的数字(来自大富翁)
    Delphi2010下,Unit aliases会影响到Code Insight功能?
    使用鼠标拖曳的方式移动、更改panel控件的大小
    将四个BYTE数值转换成IEEE754标准的浮点数
    判断shift,ctrl,alt键是否按下
    获取邮箱中的用户名
    IFM控制器中关于支线长度的说明
  • 原文地址:https://www.cnblogs.com/SkyOceanchen/p/11874663.html
Copyright © 2020-2023  润新知