我有一个简单的flask
服务器
import pdb
from flask import Flask, jsonify, abort, make_response, request, send_from_directory
from flask_cors import CORS, cross_origin
from pprint import pprint
import argparse
from mylib.mylib_rest_api import ProcessRestApiRequest
DEBUG=True
app = Flask(__name__)
CORS(app)
parser = argparse.ArgumentParser(description='Run the server')
parser.add_argument('--ip-address', default='127.0.0.1', help='Server IP Address. Default: %(default)s')
parser.add_argument('--port', type=int, default=8081, help='Server port')
args = parser.parse_args()
@app.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error': 'Not found'}), 404)
def do_pre_serve_actions():
if not request.json: abort(400)
# Extract the data
dictReq = request.get_json(force=True)
if DEBUG:
pprint('dictReq: '+str(dictReq))
return dictReq
def do_post_serve_actions(dictResp):
if DEBUG:
pprint("dictResp: "+str(dictResp))
dictJSONResp = jsonify(dictResp)
objRespADF = make_response(dictJSONResp)
return objRespADF
@app.route('/<target>', methods=['POST'])
def serve(target):
dictReq = do_pre_serve_actions()
dictResp = ProcessRestApiRequest(dictReq, target)
return do_post_serve_actions(dictResp)
if __name__ == '__main__':
app.run(debug=DEBUG, host=args.ip_address, port=args.port)
请求如下所示:
^{pr2}$我得到的是:
Failed to load http://192.168.0.132:8084/mychip: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header has a value 'null' that is not equal to the supplied origin. Origin 'null' is therefore not allowed access.
我做错什么了?我在网上到处都找过了,好像我需要的东西都有。我错过什么了吗?在
如果您从文件系统而不是网络服务页面,那么Chrome和基于WebKit/Chrome的浏览器(Opera、Brave等)都可能发生这种情况。在这种情况下,没有源站点(因为它是从文件提供的),Chrome将在preflight OPTIONS请求中发送头
Origin: null
。启用CORS的Flask服务器将在飞行前的响应中使用这个源代码进行应答,但是Chrome拒绝将其作为无效的源代码,即使Chrome首先发送的是这个源代码。在Firefox也在OPTIONS请求中发送header
Origin: null
,但是它可以接受响应,因此它确实发出了实际的POST请求。我还发现,当从文件系统加载时,Android上的Chrome似乎也能正常工作。在作为一种解决方法,从HTTP服务器提供测试文件。最简单的方法(仅用于测试目的)是使用Python的
SimpleHTTPSever
。只需切换到包含测试HTML文件的目录并运行以下命令:它将启动一个监听端口8000的HTTP服务器,因此您可以使用URL
http://localhost:8000/cors_test.html
将文件加载到浏览器中。在还要注意,}对象应该为您正确地构造请求。在
Access-Control-Allow-*
报头是在飞行前响应中发送的,而不是请求中发送的。flask-cors
通常会为您处理这些问题,而客户端{相关问题 更多 >
编程相关推荐