对飞行前的响应未通过访问控制通道

2024-09-29 23:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的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.

我做错什么了?我在网上到处都找过了,好像我需要的东西都有。我错过什么了吗?在


Tags: fromdebugimportappparserreturnportrequest
1条回答
网友
1楼 · 发布于 2024-09-29 23:20:51

如果您从文件系统而不是网络服务页面,那么Chrome和基于WebKit/Chrome的浏览器(Opera、Brave等)都可能发生这种情况。在这种情况下,没有源站点(因为它是从文件提供的),Chrome将在preflight OPTIONS请求中发送头Origin: null。启用CORS的Flask服务器将在飞行前的响应中使用这个源代码进行应答,但是Chrome拒绝将其作为无效的源代码,即使Chrome首先发送的是这个源代码。在

Firefox也在OPTIONS请求中发送headerOrigin: null,但是它可以接受响应,因此它确实发出了实际的POST请求。我还发现,当从文件系统加载时,Android上的Chrome似乎也能正常工作。在

作为一种解决方法,从HTTP服务器提供测试文件。最简单的方法(仅用于测试目的)是使用Python的SimpleHTTPSever。只需切换到包含测试HTML文件的目录并运行以下命令:

$ python -m SimpleHTTPServer

它将启动一个监听端口8000的HTTP服务器,因此您可以使用URL http://localhost:8000/cors_test.html将文件加载到浏览器中。在

还要注意,Access-Control-Allow-*报头是在飞行前响应中发送的,而不是请求中发送的。flask-cors通常会为您处理这些问题,而客户端{}对象应该为您正确地构造请求。在

相关问题 更多 >

    热门问题