分享

数据库|Flask解决跨域问题

 算法与编程之美 2020-08-08

什么是跨域问题

最近在做一个前后端分离的项目时,需要前端向后端发起请求然后得到数据,却始终拿不到后端返回的数据,但是通过浏览器直接访问这个接口是可以得到返回的数据。这让我百思不得其解,最后通过看报错得到了如下信息:

通过百度知道这是因为浏览器的同源策略规定某域下的客户端在没明确授权的情况下,不能

读写另一个域的资源。而在实际开发中,前后端常常是相互分离的,并且前后端的项目部署也常常不在一个服务器内或者在一个服务器的不同端口下。前端想要获取后端的数据,就必须发起请求,如果不做一些处理,就会受到浏览器同源策略的约束。后端可以收到请求并返回数据,但是前端无法收到数据。

解决办法

方案使用make_response

具体代码如下

from flask import Flask, request, jsonify, make_response

app=Flask(__name__)

@app.route('/')

def index():

    user_count = User.query.count()

    data = request.args.to_dict()

    user_list = User.query.order_by(

        User.id.asc()

    ).paginate(page=int(data.get('page')),per_page=int(data.get('limit')))

    res = make_response(jsonify(

        {"code":0,

         "msg":'',

         "count":user_count,

         "data":[{"id":user.id,"username":user.username,"password":user.password} for user in user_list.items]

         }

    ))

    res.headers['Access-Control-Allow-Origin'] = '*'

    res.headers['Access-Control-Allow-Method'] = '*'

    res.headers['Access-Control-Allow-Headers'] = '*'

    return res

前端能够接收到返回的内容

方案使用CROS

首先安装flask_cors这个包 pip install flask_cors

from flask_cors import *

app = Flask(__name__)

CORS(app, supports_credentials=True)

@app.route('/')

def index():

    user_count = User.query.count()

    data = request.args.to_dict()

    user_list = User.query.order_by(

        User.id.asc()

    ).paginate(page=int(data.get('page')),per_page=int(data.get('limit')))

    return jsonify(

        {"code":0,

         "msg":'',

         "count":user_count,

         "data":[{"id":user.id,"username":user.username,"password":user.password} for user in user_list.items]

         }

    )

总结

之所以浏览器要制定同源策略,其中一个重要的原因就是对cookie的保护。Cookie中存着sessionid,如果黑客获取了sessionid,在有效的时间内就能登录账号。当访问了一个恶意网站 如果没有同源策略 那么这个网站就能通过js 访问document.cookie 得到用户关于的各个网站的sessionID 其中可能有银行网站等等。

虽然有同源策略,但是不是说就绝对安全,只能说是提高了一点攻击的成本。


END

主  编   |   王文星

责  编   |   刘玉江

 where2go 团队


微信号:算法与编程之美          

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多