vue flask 跨域问题

  最近一直忙着检查点测试平台的开发。之前主要是从事后端开发,现在所有的东西都需要自己一个人撸。也遇到了之前在后端服务开发中未碰到的问题,在此记录下解决的全过程。

  前端采用vue + element的技术,开发完成后生成静态文件扔到nginx服务器上。后端用python的flask,完成之后放到gunicorn中。两个单独开发到没有什么太大问题,问题就出在将两个合在一起的时。

  第一次合并的时候出现了下面的问题,额。。。跨域问题,问题不大改改后台的响应就ok,就写了一个简单的装饰器

  

  装饰器代码:

def mkrp(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        repjson = func(*args, **kw)
        response = make_response(repjson)
        response.headers[‘Access-Control-Allow-Origin‘] = ‘*‘
        response.headers[‘Access-Control-Allow-Methods‘] = ‘PUT,GET,POST,DELETE,OPTIONS‘
        return response
    return wrapper

   然后就是见证奇迹的时刻,果然页面正常,部分请求都好了。但好景不长,为啥post请求全跪了呢,还都是上面的问题,wtf

                

  在chrome的开发者工具中查看请求信息,发现所有的post请求之前,都会发一次 Request - Method:OPTIONS的请求,然后post请求就没发出,这玩意儿到底又是啥呢。

  options请求类似于一个探针,在post请求前先去发送,然后根据Access-Control-*的返回,判断是否是否对指定站点有访问权限。然后网上找了各种资料,其中艰辛不表。

  找的各种方案基本上不合适,不知道是不是我自己写的代码太low导致的。咨询了运维的兄弟,他直接让我走ngix转发,让两个后台的请求直接和前端地址再同一个域里面,nginx的配置如下:

  

server
{
        listen 8099;
        server_name mywebhost;
        index index.html index.htm index.php;
        root /usr/local/vue-dists/dist;
        location / {
        try_files $uri $uri/ @router;
                index index.html;
        }
        location @router {
                rewrite ^.*$ /index.html last;
        }
        #access_log off;
        access_log logs/vue.log main;
        error_log logs/vue_error.log;
        location /python/ {
                if ($request_method = ‘OPTIONS‘) {
                        add_header ‘Access-Control-Allow-Origin‘ ‘*‘;
                        add_header ‘Access-Control-Allow-Methods‘ ‘GET, POST, OPTIONS‘;
                        add_header ‘Content-Type‘ ‘text/plain‘;
                        add_header ‘Content-Length‘ 0;
                        return 204;
                }
                if ($request_method = ‘POST‘) {
                        add_header ‘Access-Control-Allow-Origin‘ ‘*‘;
                        add_header ‘Access-Control-Allow-Methods‘ ‘GET, POST, OPTIONS‘;
                }
                if ($request_method = ‘GET‘) {
                        add_header ‘Access-Control-Allow-Origin‘ ‘*‘;
                        add_header ‘Access-Control-Allow-Methods‘ ‘GET, POST, OPTIONS‘;
                }

                proxy_pass http://myapihost:5000/;
        }
}
~

  果然,这位仁兄的解决方案果然靠谱,跨域的问题全部解决。

  但是问题是解决了,但是心中还有是有些不甘,咱毕竟是个有追求的开发者,不能这么认命,还是想通过服务端的方式来解决这个问题。不是post请求之前发了一个options的探针吗,咱就吧请求拦截了,你要啥,我返回啥。

  看了下flask的官方文档,可以用before_request的装饰器来过滤拦截,上代码:

  

@app.before_request
def option_replay():
    if request.method ==‘OPTIONS‘:
        resp = app.make_default_options_response()
        if ‘ACCESS_CONTROL_REQUEST_HEADERS‘ in request.headers:
            resp.headers[‘Access-Control-Allow-Headers‘] = request.headers[‘ACCESS_CONTROL_REQUEST_HEADERS‘]
        resp.headers[‘Access-Control-Allow-Methods‘] = request.headers[‘Access-Control-Request-Method‘]
        resp.headers[‘Access-Control-Allow-Origin‘] = request.headers[‘Origin‘]
        return resp

@app.after_request
def set_allow_origin(resp):
    h = resp.headers
    if request.method != ‘OPTIONS‘ and ‘Origin‘ in request.headers:
        h[‘Access-Control-Allow-Origin‘] = request.headers[‘Origin‘]

  其中我遇到了一个坑,对于响应头,我一开始只设置了all methods和allow orgin,返回还是怎都有问题,后来查了阮一峰大神的博客,找到相关内容,将allow headers加上去就木有问题了。

  

  参考资料:http://www.ruanyifeng.com/blog/2016/04/cors.html 

 

   

 

  

  

原文地址:https://www.cnblogs.com/rubeitang/p/8351119.html

时间: 2024-07-30 20:14:04

vue flask 跨域问题的相关文章

vue resource 携带cookie请求 vue cookie 跨域

vue resource 携带cookie请求 vue cookie 跨域 1.依赖VueResource 确保已安装vue-resource到项目中,找到当前项目,命令行输入: npm install vue-resource --save 在主方法添加 过滤 Vue.http.interceptors.push(function(request, next) {//拦截器 // 跨域携带cookie request.credentials = true; next() }) 以下是针对每个请

解决vue axios跨域请求发送两次问题

问题: vue axios跨域请求,在Request Headers加Authorization传递Token时,发现统一请求触发了两次,第一次是Request Method: OPTIONS请求. 原因: 跨域请求时,浏览器会首先使用OPTIONS方法发起一个预请求,判断接口是否能够正常通讯.如果通讯异常,则不会发送真正的请求,如果测试通讯正常,则开始真正的请求. 解决方法: 后台:判断请求方式是OPTIONS,则不处理: 预请求 发送真正请求  PHP解决方法 class Common ex

flask 跨域问题

在Flask开发RESTful后端时,前端请求会遇到跨域的问题.下面是解决方法.Python版本:3.5.1 下载flask_cors包 pip install flask-cors使用flask_cors的CORS,代码示例 from flask_cors import * app = Flask(__name__)CORS(app, supports_credentials=True) 如果还有其他问题可以查看flask_cors的文档.

vue + vue-resource 跨域访问

使用vue + vue-resource进行数据提交,后台使用RESTful API的方式存取数据,搞了一天,终于把后台搞好了.进行联合调试时,数据不能提交,报403错误: XMLHttpRequest cannot load http://localhost:8090/xxx/xxx. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header

tornado django flask 跨域解决办法(cors)

XMLHttpRequest cannot load http://www.baidu.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://10.16.16.25:9988' is therefore not allowed access. tornado 这个就是典型的cors,允许后端允许跨域的方法.第二种方法,反向代理还在实践中 #!/usr/bi

vue resource 携带cookie请求 vue cookie 跨域(六)

1.依赖VueResource  确保已安装vue-resource到项目中,找到当前项目,命令行输入: npm install vue-resource --save 在主方法添加 过滤 Vue.http.interceptors.push(function(request, next) {//拦截器 // 跨域携带cookie request.credentials = true; next() }) 以下是针对每个请求都会携带cookie ,也可以指定接口请求携带cookie this.$

vue项目跨域问题

跨域 了解同源政策:所谓"同源"指的是"三个相同". 协议相同 域名相同 端口相同 解决跨域 jsonp 缺点:只能get请求 ,需要修改B网站的代码 cors 这个方案缺点 是 ie6 7 兼容不好(倒是不见得要兼容).需要B网站在响应中加头 postMessage 缺点也是 ie6 7 兼容不好(倒是不见得要兼容).需要修改B网站的代码 iframe window.name 传值得方式很巧妙,兼容性也很好.但是也是需要你能修改B网站代码 服务端主动请求B网站,兼

SpringBoot rest-api+Vue CORS跨域.md

跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 目前用到两种方式 前后端统一通过代理转发,使api和vue web都通过同一域名+端口来访问,以确保同源: 通过服务端接口层配置,支持CORS请求: 服务层配置 我们目前前端有Vue.安卓.iOS,后端共用一套,因此更好的方式是通过修改服务层,以支持多端请求. Spring MVC配置方式 Spring MVC从4.2版本开始增加对CORS的支持,只需要在Controller或

Vue代理&跨域

Vue 本地代理 纯前端技术解决跨域 vue-axios获取数据很多小伙伴都会使用,但如果前后端分离且后台没设置跨域许可,那要怎样才能解决跨域问题? 常用方法有几种: 通过jsonp跨域 通过修改document.domain来跨子域 使用window.name 或location.hash 来进行跨域 使用HTML5中的window.postMessage方法来跨域 图片ping或script标签跨域 WebSocket CORS 以上方法或多或少都有一定限制,有的不支持post有的需要后台配