簡體   English   中英

"Python Flask Cors 問題"

[英]Python Flask Cors Issue

我對 Python 有點陌生,但我在使用 Node 應用程序時遇到了同樣的問題。 我正在向我的本地 Python 服務器發出一個非常標准的 jQuery AJAX 請求:

init: function(callback) {
            var token = _config.get_token();

            $.ajax({
                    url: 'http://localhost:5000/api/ia/v1/user_likes',
                    type: 'POST',
                    contentType: 'application/json',
                    datatype: 'json',
                    data: token
                })
                .done(function(data) {
                    callback(data);
                })
                .fail(function(err) {
                    callback(err);
                });

            callback(token);
        }

在我嘗試了其他人的建議和答案之后。 這是我使用的,它有效。

腳步:

  1. pip install flask flask-cors

  2. 復制並粘貼到app.py文件中

代碼

from flask import Flask, jsonify
from flask_cors import CORS, cross_origin

app = Flask(__name__)
CORS(app, support_credentials=True)

@app.route("/login")
@cross_origin(supports_credentials=True)
def login():
  return jsonify({'success': 'ok'})

if __name__ == "__main__":
  app.run(host='0.0.0.0', port=8000, debug=True)
  1. python app.py

注意:請確保在您客戶端的 ajax 配置中具有以下內容:

$.ajaxSetup({
    type: "POST",
    data: {},
    dataType: 'json',
    xhrFields: {
       withCredentials: true
    },
    crossDomain: true,
    contentType: 'application/json; charset=utf-8'
});

如果有人想知道, support_credentials=True只是意味着它沿着有效負載來回發送 cookie。

Flask 有flask-cors模塊。 以下是代碼片段以及過程。

  1. pip install -U flask-cors

  2. 在您的燒瓶應用程序中添加以下行:

     from flask import Flask from flask_cors import CORS, cross_origin app = Flask(__name__) CORS(app) @app.route("/") def helloWorld(): return "Hello world"

點擊此鏈接查看更多

以下是如何通過自己處理 CORS 細節來弄臟你的手:

handle_result = {'result': True, 'msg': 'success'}

try:
    # origin, where does this request come from, like www.amazon.com
    origin = flask.request.environ['HTTP_ORIGIN']
except KeyError:
    origin = None

# only accept CORS request from amazon.com
if origin and origin.find('.amazon.com') > -1:
    resp = flask.make_response(str(handle_result))
    resp.headers['Content-Type'] = 'application/json'

    h = resp.headers
    # prepare headers for CORS authentication
    h['Access-Control-Allow-Origin'] = origin
    h['Access-Control-Allow-Methods'] = 'GET'
    h['Access-Control-Allow-Headers'] = 'X-Requested-With'

    resp.headers = h
    return resp

return flask.abort(403)

請在你的python文件中使用@cross_origin(origin='*')

from flask import Flask, jsonify
from flask_cors import CORS, cross_origin

app = Flask(__name__)

@app.route("/login", methods = ['GET'])
@cross_origin(origin='*')
def login():
  return jsonify({'success': 'ok'})

if __name__ == "__main__":
  app.run(host='0.0.0.0', port=8000, debug=True)

在路由裝飾器之后使用 cors 裝飾器。

這是文檔中的一個片段...

@app.route("/")
@cross_origin() # allow all origins all methods.
def helloWorld():
  return "Hello, cross-origin-world!"

現在,您似乎正在使用 json,如果是這種情況,您可能應該閱讀文檔,因為它特別提到了這個用例,以及要設置的 cors_headers ......了解。

http://flask-cors.readthedocs.org/en/latest/#using-json-with-cors

我嘗試了上述所有解決方案,但他們一直對我失敗。 我敢肯定,大多數解決方案都會奏效,但是我在客戶端應用程序中犯了一個非常明顯的錯誤。 也許這可以為你們中的一些人節省一些調試時間。 我的請求,我通過以下方式調用了我的 REST 服務

'localhost:<port>/<myApi>'

對我來說,修復就像將服務調用為 http... 一樣簡單:

'http://localhost:<port>/<myApi>'

一個愚蠢的錯誤。

嘗試這個:

@app.after_request
def add_headers(response):
    response.headers.add('Access-Control-Allow-Origin', '*')
    response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')

我已經在 Flask 網站上嘗試過 @cross_origin 教程,但是,它對我不起作用。

但似乎您可以稍后在響應中添加標頭。

這是我剩余的代碼,我認為它可能有用。

from flask import Flask, request
from sklearn.externals import joblib

app = Flask(__name__)

以下解決方案對我有用。 我包含了一個方法,該方法將添加您所需的標頭,然后引發 HTTP 響應。 前任:

def some_method(response_data, status_code):
    response_data = //here you can manipulate the data, JSONify, convert arrays into objects or vice versa
    headers = {
        "Content-Type": "application/json",
        "Access-Control-Allow-Origin": '*',
        "Access-Control-Allow-Methods": 'PUT, GET, POST, DELETE, OPTIONS',
        "Access-Control-Allow-Headers": 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'
        }
    //THEN RAISE HTTPResponse
    raise HTTPResponse(status, headers, body)

注意:上面的方法不是python編譯的,所以你可能需要編輯它。

基於 GyuHyeon Choi 的響應,但添加了return response和額外的Access-Control-Expose-Headers對我有用。

@app.after_request
def add_headers(response):
    response.headers.add('Content-Type', 'application/json')
    response.headers.add('Access-Control-Allow-Origin', '*')
    response.headers.add('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS')
    response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
    response.headers.add('Access-Control-Expose-Headers', 'Content-Type,Content-Length,Authorization,X-Pagination')
    return response

在客戶端,您只需要確保您的服務器正在處理的數據類型。 例如表單數據或 json。

注意:cross_origin 的位置應該是對的。

對我來說,下面寫的代碼很神奇

from flask import Flask,request,jsonify
from flask_cors import CORS,cross_origin
app=Flask(__name__)
CORS(app, support_credentials=True)
@app.route('/api/test', methods=['POST', 'GET','OPTIONS'])
@cross_origin(supports_credentials=True)
def index():
    if(request.method=='POST'):
     some_json=request.get_json()
     return jsonify({"key":some_json})
    else:
        return jsonify({"GET":"GET"})


if __name__=="__main__":
    app.run(host='0.0.0.0', port=5000)

請注意,如果您的應用程序返回 500 錯誤,您的瀏覽器可能會將其理解為 cors 錯誤,因為燒瓶 cors 僅在返回時添加標頭。

因此,如果其他選項不起作用,您可以將燒瓶置於調試模式以驗證它是否不僅僅是內部服務器錯誤。

.flaskenv

FLASK_ENV=development

我已經使用以下命令安裝了 Flask,並使用了這樣的聲明:

pips3.6 install --user flask-cors

  from flask_cors import CORS   
    app = Flask(__name__)
    CORS(app)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM