我已經瀏覽了許多SO答案,似乎無法找到此問題。我有一種感覺,我只是想念一些明顯的東西。Python Flask CORS - API始終允許任何來源
我有一個基本的Flask API,並且我已經實現了flask_cors擴展和自定義Flask裝飾器 [@crossdomain from Armin Ronacher]。 1(http://flask.pocoo.org/snippets/56/)兩者都顯示相同的問題。
這是我的示例應用程序:
application = Flask(__name__,
static_url_path='',
static_folder='static')
CORS(application)
application.config['CORS_HEADERS'] = 'Content-Type'
@application.route('/api/v1.0/example')
@cross_origin(origins=['http://example.com'])
# @crossdomain(origin='http://example.com')
def api_example():
print(request.headers)
response = jsonify({'key': 'value'})
print(response.headers)
return response
(編輯3插入):
當我做一個GET請求,以便從JS端點在瀏覽器中(從127.0.0.1),它總是返回200,當我希望看到:
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:5000' is therefore not allowed access. The response had HTTP status code 403.
捲曲:
ACCT:ENVIRON user$ curl -i http://127.0.0.1:5000/api/v1.0/example
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 20
Access-Control-Allow-Origin: http://example.com
Server: Werkzeug/0.11.4 Python/2.7.11
Date: [datetime]
{
"key": "value"
}
LOG:
Content-Length:
User-Agent: curl/7.54.0
Host: 127.0.0.1:5000
Accept: */*
Content-Type:
Content-Type: application/json
Content-Length: 20
127.0.0.1 - - [datetime] "GET /api/v1.0/example HTTP/1.1" 200 -
我還沒有看到所有的響應正確的頭,它似乎並不關心的來源是在要求什麼。
任何想法我失蹤了?謝謝!
編輯:
作爲一個側面說明,在看文檔例如here(https://flask-cors.readthedocs.io/en/v1.7.4/#a-more-complicated-example),它表明:
@app.route("/")
def helloWorld():
'''
Since the path '/' does not match the regular expression r'/api/*',
this route does not have CORS headers set.
'''
return '''This view is not exposed over CORS.'''
...因爲我已經有這是頗爲有趣根路徑(和其他)暴露在沒有任何CORS裝飾,並且他們從任何來源工作正常。所以看起來這個設置有一些根本性的錯誤。
順着這些線索,教程here(https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask)似乎表明,瓶API應該自然無保護地暴露(我假設只是因爲CORS擴展尚未應用),但我的應用程序基本上只是工作就像CORS擴展甚至不存在(除了日誌中的幾個註釋,你可以看到)。
編輯2:
我的意見是不清楚的,所以我創建了三個例子端點上AWS API網關與不同CORS設置。他們是GET方法端點簡單地返回 「成功」:
1)CORS未啓用(默認):
響應:
的XMLHttpRequest不能加載 https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-default。 對預檢請求的響應未通過訪問控制檢查:否 請求的 資源上存在「訪問控制 - 允許來源」標頭。 'http://127.0.0.1:5000'因此不允許 訪問。響應有HTTP狀態代碼403
2)CORS啓用 - 產地限制:
訪問控制允許報頭: '內容類型'
訪問控制 - 允許-產地: 'http://example.com'
- 端點:https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-enabled-example
響應:
的XMLHttpRequest不能加載 https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-enabled-example。 對預檢請求的響應未通過訪問控制檢查: '訪問控制允許來源'標頭的值'http://example.com' 不等於提供的原點。因此不允許訪問原產地 'http://127.0.0.1:5000'。
3)CORS啓用 - 產地通配符:
- 訪問控制允許信頭: 'Content-Type的'
- 訪問控制允許來源: '*'
- 終點:https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-enabled-wildcard
響應:
"success"
我對基礎設施沒有經驗,但我的期望是啓用Flask CORS擴展會導致我的api端點模仿這種行爲,這取決於我在origins=
設置中設置的內容。我在這個Flask設置中缺少什麼?
解決方案編輯:
好了,因爲在我結束一些明顯不正常,我剝了下來我的應用程序,並重新實現一些非常基本的API CORS產地限制的每個變化。我一直使用AWS的彈性beanstalk來託管測試環境,所以我重新上傳了這些示例,並向每個請求發送了一個JS ajax請求。它正在工作。
我在裸露的終端上遇到了Access-Control-Allow-Origin
錯誤。看起來,當我配置應用程序進行部署時,我取消了註釋CORS(application, resources=r'/api/*')
,這明顯允許所有裸體終端的源代碼!
我不知道爲什麼我的路線有特定的限制(origins=[]
)也允許一切,但這肯定是某種類型的打字錯誤或小事,因爲它現在正在工作。
特別感謝sideshowbarker的所有幫助!
對不起,我還不清楚你的期望。編輯2中的所有情況在我看來都像預期的那樣工作。案例#1是你會考慮按預期工作的,對吧?在那一箇中,你沒有爲該端點啓用CORS,所以瀏覽器不允許訪問該響應。就CORS協議而言,第二種情況也是按照預期的方式工作,因爲您已將允許的來源設置爲「http:// example.com」,但您從「http://127.0.0.1」發送請求:5000',所以瀏覽器不會讓你的代碼在'http://127.0.0。1:5000'參見響應 – sideshowbarker
就CORS協議而言,情況#3也按預期工作 - 因爲根據您所說的配置,「允許任何來源運行的前端代碼訪問來自該端點的響應」,所以在您發送請求的源中運行的代碼成功訪問響應。 – sideshowbarker
我不明白是什麼*「導致我的API端點模仿這種行爲,這取決於我在'origins ='設置中設置的內容」*意味着 – sideshowbarker