Flask——跨域问题解决


背景:最近在使用Flak-restful+Vue来做一个app,将Vue打包在了一个安卓的壳子里面。但是这期间出现了一个比较有意思的问题——跨域。做后端开发的兄弟应该在前后端的分离项目中应该对这个问题司空见惯了。但是这个问题还是有一定的讨论意义,所以还是拿出来说一下。

1.CORS

  这个组件在很多框架的跨域问题使用中都用的到,比如django里面自带了这个中间件,需要的朋友可以百度一下,用起来很方便。flask使用的时候代码如下。

  首先得安装这个包,在flask中是没有自带的。



pip install flask_cors



  之后代码中使用如下:



1 from flask_cors import CORS
2 
3 app = Flask(__name__)
4 CORS(app, supports_credentials=True)
5 
6 if __name__ == "__main__":
7     app.run()



  当然了,如果不使用Flak-restful的话可以写一个中间件,对响应头进行操作,在这里就不进行过多描述了。

2.JSONP

  很多人在django restful-framework-api中习惯了使用jsonp的,但是flask自带的jsonify这个东西对于跨域而言好像并没有什么作用,因此这条路可以别想了。

3.配置options请求

  ***先说明这种方式是要和方法1一起使用的***

  众所周知在处理跨域的时候会先发一个options请求给服务端,这个请求可以说是一个“预请求”吧,用于探测后续真正需要发起的跨域 POST、PUT、PATCH 请求对于服务器来说是否是安全可接受的,因为跨域提交数据对于服务器来说可能存在很大的安全问题。

  所以在这里必须设置一下options请求来解决跨域问题。

 



1 class TabrResource(Resource):
2 
3     def options(self):
4         return {'Allow': '*'}, 200, \
5                {'Access-Control-Allow-Origin': '*',
6                 'Access-Control-Allow-Methods': 'HEAD, OPTIONS, GET, POST, DELETE, PUT',
7                 'Access-Control-Allow-Headers':
8                     'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild',
9                 }



 

  这里我写了一个类,继承了Resource这个类,之后重写了options方法。通过接口的类继承TabrResource,所有的接口的类都会有一个options方法,来应对跨域请求。这个亲测有效。

*最后的最后说明一下,在Vue编译到安卓程序里面以后相当于是安卓程序里面嵌入了一个浏览器。可以配置一下把所有的跨域请求全部不拦截,直接放行。