python flask 跨域请求 The value of the 'Access-Control-Allow-Origin' header in the response must not be

如果写的跟其他人一样,没一点干货,我肯定懒得写。毕竟我不是为了骗赞。

今天用flask写了一个http的server,js在调用的时候, 报了一个错,说是要添加跨域请求。于是我从网上抄了一段解决跨域的代码。

@app.route('/rec',method=['POST'])
def getdata():
	retdict = {}
	retdict['data'] = 'return data'

	response = make_response(json.dumps(retdict))

	response.headers['Access-Control-Allow-Credentials'] = 'true'
	response.headers['Access-Control-Allow-Origin'] = '*'
	response.headers['Access-Control-Allow-Methods'] = 'POST'
	response.headers['Access-Control-Allow-Headers'] = 'Content-Type, X-Requested-With'

	return response

然后js报了一个错:

Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.

百度谷歌了一阵子, 说是'Access-Control-Allow-Origin' 不能使用通配符, 需要指定。 我查看了其他成功的请求, 发现成功的response里边的这个字段的值是 'http://68.174.75.238:8081' , 需要填请求方的地址和IP。 然后我百度了一下,没有发现有怎么获取flask的请求IP地址和端口的。 只查到获取请求地址的。 这让人很尴尬。

后面仔细研究了一下 request的内容, 发现 request.environ 里边包含了请求方的很多消息。  里边就包含了请求方的 origin,于是只要将其拷贝到这个response里边就可以了。 代码如下

@app.route('/rec',method=['POST'])
def getdata():
	retdict = {}
	retdict['data'] = 'return data'

	response = make_response(json.dumps(retdict))

	response.headers['Access-Control-Allow-Credentials'] = 'true'
	response.headers['Access-Control-Allow-Origin'] = request.environ['HTTP_ORIGIN']
	response.headers['Access-Control-Allow-Methods'] = 'POST'
	response.headers['Access-Control-Allow-Headers'] = 'Content-Type, X-Requested-With'

	return response

这个environ里边还有其他内容,大家可以打印出来看看,可能有很多需要的地方。在方法的最前面加上一行打印语句即可

  print request.environ

你可能感兴趣的:(python flask 跨域请求 The value of the 'Access-Control-Allow-Origin' header in the response must not be)