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://192.168.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

我的个人网站已经上线:www.qiaonan.top 

以后我的技术文档将只在我的个人网站上发布。

网站上还有一个小游戏可以玩哦。

  • 3
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

桥南玄机子

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值