如果写的跟其他人一样,没一点干货,我肯定懒得写。毕竟我不是为了骗赞。
今天用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