Я потратил три дня, чтобы исправить эту ошибку CORS, но не смог.Не могли бы вы подсказать мне, как решить эту проблему?
Я настроил Angular (внешний интерфейс) + Flask (внутренний API) на той же локальной машине с док-контейнерами.(Ubuntu 16.04)
Докер # 1 : колба с портом 5000 открыта.-> Выполнено с manage.py --host 0.0.0.0
для внешнего доступа.
Docker # 2 : угловое приложение с портом 4200 открыто.-> Выполнено с ng serve --port 0.0.0.0
для внешнего доступа.
curl --user username:password http://127.0.0.1:5000/v1/classes/
преуспел в моем хост-ПК и внутри углового док-контейнера.Также перейдите по URL-адресу в браузере Chrome.
Но я встретил ошибку CORS для ОПЦИИ, когда попытался вызвать get api в угловом коде;
OPTIONS http://127.0.0.1:5000/v1/classes/ 401 (UNAUTHORIZED)
Access to XMLHttpRequest at 'http://127.0.0.1:5000/v1/classes/' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
Вот мой угловой сервискод;
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { delay, map, catchError, tap } from 'rxjs/operators';
const endpoint = 'http://127.0.0.1:5000/v1/';
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa('username:password')
})
};
@Injectable()
export class ExampleCRUDService {
constructor(private http: HttpClient) {}
private extractData(res: Response) {
let body = res;
return body || { };
}
getClasses(): Observable<any> {
return this.http.get(endpoint + 'classes/', httpOptions).pipe(
map(this.extractData));
}
}
ТЕСТ Ниже приведены мои испытания со стороны колбы, но ни одно из них не было успешным.
CORS(app)
@app.route("/")
@cross_origin()
CORS(app, resources={r"/*": {"origins": "*"}})
@app.after_request
def after_request(response):
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE')
return response
app.config['CORS_HEADERS'] = 'Content-Type'
cors = CORS(app, resources={r"/v1": {"origins": "http://localhost:4200"}})
@app.route('/')
@cross_origin(origin='localhost',headers=['Content-Type','Authorization'])
CORS(app, expose_headers='Authorization')