简体   繁体   English

使用 Flask RestX 启用 Cors

[英]Enabling Cors with Flask RestX

Trying to add CORS to my flask app that is using an API created with flask-restx.尝试将 CORS 添加到我的 flask 应用程序中,该应用程序使用的是使用 flask-restx 创建的 API。 Hopefully someone here can spot what I am doing wrong.希望这里有人能发现我做错了什么。

In the console that is running flask I don't get any relevant logs and the website is saying Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://127.0.0.1/api/v1/test. (Reason: CORS request did not succeed). Status code: (null).在运行 flask 的控制台中,我没有得到任何相关日志,并且网站说Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://127.0.0.1/api/v1/test. (Reason: CORS request did not succeed). Status code: (null). Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://127.0.0.1/api/v1/test. (Reason: CORS request did not succeed). Status code: (null).

Here is a reproduction of my user case that is giving me the same errors and is mimicking how I have set it up.这是我的用户案例的复制品,它给了我同样的错误,并模仿了我的设置方式。

from flask import Flask
from flask_cors import CORS
from flask_restx import Namespace, Resource, Api
from flask import jsonify, make_response
from flask import Blueprint, render_template_string
import logging

logging.basicConfig()
LOGGER = logging.getLogger("reprod-case")
LOGGER.setLevel(logging.DEBUG)
LOGGER.info("Created LOGGER")
logging.getLogger('flask_cors').level = logging.DEBUG


# Create the restx namespace with a specified path
ns = Namespace(name='api_v1', path="/api/v1")


@ns.route('/test')
class Deck(Resource):
    def get(self):
        print("get")
        return make_response(jsonify({"message": "You did a Get!"}), 200)

    def put(self):
        print("Put")
        return None, 201


html_page = """
<html lang="en">
<body>
<button type="submit" name="myButton" value="Value">Click Me</button>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
$(document).ready(function() {
    $('button').on('click',function(e){
        const vote_value = e.currentTarget.attributes.value.value;
        console.log()
        $.ajax({
            type: 'GET',
            crossDomain: true,
            withCredentials: true,
            url: 'http://127.0.0.1/api/v1/test',
            contentType: 'application/json'
        })
    });
});
</script>
</body>
</html>
"""


# Blueprint for the webpage and add a route
bp = Blueprint("/", __name__)


@bp.route('/')
def home_route():
    return render_template_string(html_page)


# Setup the app, Cors, add the namespace and blueprint
def create_app():
    app = Flask(__name__)
    # CORS(app, resources={r"/api/*": {"origins": "*"}},
    CORS(app,
         resources={r"/api/*": {"origins": ['http://192.168.50.16:5000', 'http://localhost:5000']}},
         supports_credentials=True
         )

    api = Api(doc="/api/", title="Endpoints")
    api.add_namespace(ns,  path="/api/v1")
    app.register_blueprint(bp)
    api.init_app(app)
    return app


if __name__ == "__main__":
    app_ = create_app()
    app_.run(debug=True)

I have also tried enabling cors by setting up an after_request我还尝试通过设置 after_request 来启用after_request

    @app.after_request
    def enable_cors(response):
        response.headers.add("Access-Control-Allow-Headers", "authorization,content-type")
        response.headers.add("Access-Control-Allow-Methods", "DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT")
        response.headers.add("Access-Control-Allow-Origin", "*")
        return response

See this blog post from RapidAPI https://rapidapi.com/guides/handle-cors-flask请参阅 RapidAPI https://rapidapi.com/guides/handle-cors-flask的这篇博文

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM