zoukankan      html  css  js  c++  java
  • Ajax与Flask传值的跨域问题

    前后端分离时,关于前端Ajax-Post数据时,遇到的一个问题

    在写一个报名提交的页面,前端组写了前端页面
    但是没有写后端的传值,本来想构建Flask结构目录
    但是想实现API的形式,可以控制提交时间段-在不招新的时间关闭后端
    就打算分离开,form表单提交的Post一开始是这样写的

    $("form").submit(function(){
    	var flagname  = isname();
    	var flagphone = isphone();
    	var flagclass = isclass();
    	var flagemail = isemail();
    	var flaggroup = isgroup();
    
    	if(flagname == true && flagphone == true && flagclass == true 
    		&& flagemail == true && flaggroup == true){
    		var data={
    			InfoNmae:InfoName.value,
    			InfoPho:InfoPho.value,
    			InfoCls:InfoCls.value,
    			InfoEmail:InfoEmail.value,
    			InfoGroup:arr,
    			InfoPower:InfoPower.value
    		};
    		$.ajax({
    			type:'POST',
    			url: "/joinus",
    			data: JSON.stringify(data),
    			dataType : 'json',
    			success:function(res){
    				alert("提交成功");
    			},
    			error: function (res){
    				var json_data=JSON.stringify(res);
    				alert(json_data);
    				// alert("现在不迎新哦~");
    			},
    		});
    	}
    	else {
    		return false;
    	}
    })
    

    后端是这样

    @app.route("/joinus",methods=['POST'])
    def index():
        data=request.get_json(force=True)
        if data:
            print(data)
            return jsonify({"status":True})
        else:
            return jsonify({"status":False})
    

    一开始想的是,直接将url改为后端运行的绝对路径不行了
    但是修改之后发现,但是一直报500错误,后来才知道是跨域问题......

    在网上找到了这种方法
    第一种直接修改数据类型为jsonp,采用GET方法,确实可行.....

    		$.ajax({
    			type:'POST',
    			url: "http://127.0.0.1:5000/joinus",
    			data: JSON.stringify(data),
    			dataType : 'jsonp',
    			success:function(res){
    				alert("提交成功");
    			},
    			error: function (res){
    				var json_data=JSON.stringify(res);
    				alert(json_data);
    				// alert("现在不迎新哦~");
    			},
    		});
    

    第二种就是在flask端加上响应头
    但是上个链接中在用make_reponse()函数形成响应头时没有将数据json化
    还是报500错误

    @app.route("/api",methods=['POST'])
    def index():
        data=request.get_json(force=True)
        if data:
            print(data)
            res = make_response(jsonify(data))
            res.headers['Access-Control-Allow-Origin'] = '*'
            res.headers['Access-Control-Allow-Methods'] = 'POST'
            res.headers['Access-Control-Allow-Headers'] = 'x-requested-with,content-type'
            return res
        else:
            return jsonify({"error":False})
    

    第三种是应用了flask集成的轮子
    直接pip install flask_cors

    from flask_cors import CORS
    
    # r'/*' 是通配符,让本服务器所有的 URL 都允许跨域请求
    CORS(app, resources=r'/*')
    
    @app.route("/joinus",methods=['GET','POST'])
    def index():
        data=request.get_json(force=True)
        if data:
            print(data)
            return jsonify({"status": True})
        else:
            return jsonify({"status": False})
    
    		$.ajax({
    			type:'POST',
    			crossDomain: true,
    			url: "http://127.0.0.1:5000/joinus",
    			data: JSON.stringify(data),
    			dataType : 'json',
    			success:function(res){
    				alert("提交成功");
    			},
    			error: function (res){
    				var json_data=JSON.stringify(res);
    				alert(json_data);
    				// alert("现在不迎新哦~");
    			},
    		});
    

    感觉第三种方便点,第二种也不错

  • 相关阅读:
    将一个表的结果集插入到另一个表中
    sqlite 函数大全
    sqlite数据库实现字符串查找的方法(instr,substring,charindex替代方案)
    sqlite 字符串 转 整型 cast 函数 (强制类型转换 )
    sqlite 截取字符串函数substr
    sql 注释 语法
    实现iOS长时间后台的两种方法:Audiosession和VOIP
    iOS越狱知多少?
    从一个开发者的角度看越狱
    iPhone系统常用文件夹位置
  • 原文地址:https://www.cnblogs.com/bay1/p/10982211.html
Copyright © 2011-2022 走看看